目錄
一、JDBC
1、jdbc連接數據庫的基本步驟(掌握**)
2、Statement和PreparedStatement的區別 (掌握***)
二、Maven
1、maven的作用
2、maven 如何排除依賴
3、maven scope作用域有哪些?
三、Spring的IOC思想
1、Spring的三大核心思想 ioc、di、aop
2、IOC思想的理解,自己的話描述一下。
3、IOC容器創建的兩種方式
4、IOC容器創建對象的注解
5、IOC容器底層如何創建對象
6、對象何時創建,何時銷毀, 能不能延遲創建,初始化方法和銷毀方法
?7、從IOC容器獲取對象的三種方式
8、bean的作用域范圍
9、相關的注解有哪些?各自作用?
四、Spring的DI思想
1、DI依賴注入有哪些方式?
2、DI依賴注入常用的注解有哪些?
3、IOC創建對象相關的注解有哪些?(對比)
五、SpringMVC
1、get和post的區別?(重點)
2、服務端接收前端請求的方式?(重點)
3、服務端響應數據給前端的方式?(重點)
4、轉發和重定向的區別和聯系?(擴展)
5、springmvc的內部執行流程圖(重點)
一、JDBC
1、jdbc連接數據庫的基本步驟(掌握**)
1. 加載驅動類(只需加載一次,新版本JDK可以省略)
2. 獲取連接對象 Connection
3. 獲取執行語句對象 Statement 或 PreparedStatement ,執行SQL語句
4. 使用 ResultSet 對象接收數據庫查詢結果(一般只有查詢語句需要)
5. 將 ResultSet 中的結果封裝成對應的 JavaBean 類型對象
6. 釋放資源、關閉連接
2、Statement和PreparedStatement的區別 (掌握***)
- Statement接口用來執行一段SQL語句并返回結果,不支持參數占位符寫法。Statement執行 ,其實是拼接sql語句的。 先拼接sql語句,然后再一起執行。如果傳入的參數是一段可執行的SQL,也會被執行,有SQL注入的風險。
- PreparedStatement接口繼承自Statement接口,相比較以前的statement, 預先處理給定的sql語句,對其執行語法檢查。 在sql語句里面使用 ? 占位符來替代后續要傳遞進來的變量。 后面進來的變量值,只會被看成參數值,不會產生任何的關鍵字的效果。
- Statement支持表名、列名動態傳入,如果表名、列名不固定,不能使PreparedStatement。
二、Maven
1、maven的作用
Maven 是一個強大的項目管理和構建工具,主要用于 Java 項目,但也可用于其他語言(如 Kotlin、Scala)。它的核心作用包括:
- 依賴管理:自動下載和管理項目所需的庫(JAR 文件),解決依賴沖突。
- 標準化項目結構:約定優于配置,統一目錄布局(如 src/main/java、src/test/resources)。
- 構建生命周期:提供編譯、測試、打包、部署等標準化流程(通過 mvn clean install 等命令)。
- 插件體系:支持擴展功能(如編譯、代碼檢查、生成文檔等)。
- 多模塊管理:簡化復雜項目的模塊化開發。
2、maven 如何排除依賴
在 Maven 中,可以通過?<exclusions>
?標簽排除傳遞性依賴(即某個依賴引入的間接依賴)。
方法 1:在依賴中直接排除
<dependency> <groupId>com.example</groupId> <artifactId>A</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>com.unwanted</groupId> <artifactId>B</artifactId> </exclusion> </exclusions>
</dependency>
方法 2:通過?dependencyManagement
?全局排除(適用于多模塊項目)
<dependencyManagement> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>A</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>com.unwanted</groupId> <artifactId>B</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
</dependencyManagement>
3、maven scope作用域有哪些?
Scope(作用域) | 說明 | 是否傳遞依賴 | 是否打入最終包 | 典型使用場景 |
---|---|---|---|---|
compile | 默認值。參與編譯、測試、運行,并會傳遞依賴。 | ? 是 | ? 是 | 項目核心依賴(如 Spring、MyBatis) |
provided | 由 JDK 或容器(如 Tomcat)在運行時提供,不傳遞依賴。 | ? 否 | ? 否 | Servlet API、JDK 工具包(如?javax.servlet ) |
runtime | 僅參與運行和測試階段,不參與編譯。會傳遞依賴。 | ? 是 | ? 是 | 數據庫驅動(如?mysql-connector-java ) |
test | 僅用于測試階段(編譯和運行測試代碼),不傳遞依賴。 | ? 否 | ? 否 | JUnit、Mockito 等測試庫 |
system | 與?provided ?類似,但需通過?systemPath ?顯式指定本地路徑,不推薦使用。 | ? 否 | ? 否 | 本地非 Maven 倉庫的第三方 JAR |
import | 僅用于?<dependencyManagement> ,從其他 POM 導入依賴范圍配置,不實際引入依賴。 | ? 否 | ? 否 | 多模塊項目統一管理依賴版本 |
<!--項目坐標依賴-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<!--作用域范圍
test:測試包中有效
provided: lombok servlet-api(tomcat包含) 只在編譯、測試、開發階段會用到,最終打包
時不需要打進去,運行時不使用。
compile:默認 所有地方都可以使用 最常用的
system:本地jar包引入,使用是系統路徑 c:/11/11.jar (一般不用)
runtime: 開發,編譯不需要,打包,運行 需要的 比如mysql
-->
<scope>test</scope>
三、Spring的IOC思想
1、Spring的三大核心思想 ioc、di、aop
核心思想 | 全稱與定義 | 關鍵作用 | 典型應用場景 | 實現方式 |
---|---|---|---|---|
IoC | Inversion of Control(控制反轉) 將對象的創建、依賴管理權交給容器(如Spring),而非程序員手動控制。 | 解耦對象間的依賴關系,提升靈活性。 | Bean 生命周期管理、模塊化開發 | 通過 IoC 容器(如?ApplicationContext )實現對象的創建和依賴管理。 |
DI | Dependency Injection(依賴注入) IoC 的具體實現方式,由容器動態注入對象所需的依賴(而非對象自己查找)。 | 減少硬編碼依賴,增強可測試性和可維護性。 | 服務層注入DAO、配置類注入組件 | 通過?@Autowired 、@Resource ?或 XML 配置自動/手動注入依賴對象。 |
AOP | Aspect-Oriented Programming(面向切面編程) 將橫切關注點(如日志、事務)與核心業務邏輯分離。 | 減少重復代碼,降低耦合,集中處理系統級功能。 | 日志記錄、事務管理、權限校驗 | 通過動態代理(JDK/CGLIB)和切面(@Aspect )實現方法攔截與增強。 |
通俗理解
-
IoC:由“工廠”(Spring)負責生產對象,程序員不再需要?
new
。 -
DI:工廠不僅生產對象,還自動組裝對象之間的依賴(如給汽車裝配發動機)。
-
AOP:在不修改汽車零件(業務代碼)的情況下,為所有車輛統一安裝GPS(日志/事務)
2、IOC思想的理解,自己的話描述一下。
- IOC全稱Inversion Of Control 控制反轉,核心的作用就是將原來由開發人員來控制的對象管理操作交由Spring來管理,spring創建出來的對象,會放到spring的一個容器中存儲,使用對象的時候可以從容器直接拿,這個容器就稱為spring ioc容器。
3、IOC容器創建的兩種方式
- xml配置文件配置方式【使用讀取xml中的bean來創建對象】
- 純注解方式 @Configuration
?
- BeanFactory接口:這是 IOC 容器的基本實現,是 Spring 內部使用的接口。面向 Spring 本身,不提供給開發人員使用。
- ApplicationContext接口:BeanFactory 的子接口,提供了更多高級特性。面向 Spring 的使用者,幾乎所有場合都使用 ApplicationContext 而不是底層的 BeanFactory。
- ClassPathXmlApplicationContext:通過讀取類路徑下的 XML 格式的配置文件創建 IOC 容器對象
- AnnotationConfigApplicationContext:通注解@Configuration方式創建 IOC 容器對象。
4、IOC容器創建對象的注解
- @Component 類上使用。
- @Bean 方法上使用,方法的返回值是對象,將返回的對象交給ioc容器管理。
5、IOC容器底層如何創建對象
- 構造方法(無參構造|有參構造)
- 工廠方法(靜態工廠方法|實例工廠方法)
6、對象何時創建,何時銷毀, 能不能延遲創建,初始化方法和銷毀方法
- 單例模式
- 創建時機:容器啟動時(ApplicationContext 初始化)立即創建。? ? ? ? ? ? ? ? ?
默認情況下,在創建ioc容器時,創建對象。 - 銷毀時機:容器關閉時(調用 context.close())。
- 單例模式的延遲初始化(Lazy) ? ?通過 @Lazy 注解,使得單例 Bean 在第一次使用時才創建。而不是在創建容器時創建對象。
- 創建對象:默認調用無參構造方法創建對象。 無參構造只執行一遍。
- 初始化方法(在對象創建后,自動調用的方法)。 初始化方法@PostConstruct注釋的方法只執行一遍。
- 銷毀前調用的方法(關閉ioc容器時,自動調用的) 。@PreDestroy注釋的方法只執行一次。
- 多例模式
- 創建時機:每次調用 getBean() 或依賴注入時創建新實例。
- 銷毀時機:對象 由 jvm虛擬機 垃圾回收器 在 后臺進程自動銷毀。
- 不用延遲創建:本身就是“延遲創建”,無需額外配置。
- 創建對象:多例模式下的,可以創建很多對象,不是提前創建的對象,是使用時創建對象。每獲取一次對象,創建一個對象,執行一次構造方法,執行一次初始化方法。
- 初始化方法和銷毀方法
@Component
public class MyBean {@PostConstruct // 初始化方法public void init() {System.out.println("Bean 初始化完成!");}@PreDestroy // 銷毀方法public void cleanup() {System.out.println("Bean 即將銷毀!");}
}
- 單例 vs 多例模式對比
特性 | 單例模式(Singleton) | 多例模式(Prototype) |
---|---|---|
創建時機 | 容器啟動時立即創建(默認行為) | 每次?getBean() ?或依賴注入時創建新實例 |
內存占用 | 全局共享一個實例,節省內存 | 每次請求新實例,內存占用較多 |
線程安全 | 需自行保證線程安全(如加鎖或使用無狀態對象) | 每次返回新實例,默認線程安全(無共享狀態) |
銷毀管理 | 容器關閉時自動銷毀 | Spring 不管理銷毀,需手動清理(如實現?DisposableBean ) |
適用場景 | 無狀態服務(如工具類、配置類、Service 層) | 有狀態對象(如用戶會話、請求上下文、DTO 封裝) |
?7、從IOC容器獲取對象的三種方式
- 名稱(強制類型轉換)
- 類型(容易出錯,需要一個對象,返回了2個對象)
- 名稱+類型(推薦)
// 2.1 通過類型獲取Goods goods1 = context.getBean(Goods.class);
// 2.2 通過名稱獲取 需要強制類型轉換
Goods goods2 = (Goods) context.getBean("goods");
// 2.3 通過名稱和類型獲取 推薦
Goods goods3 = context.getBean("goods",Goods.class);
8、bean的作用域范圍
- singleton
- prototype
- request
- session
作用域 | 描述 | 創建時機 | 銷毀時機 | 線程安全 | 適用場景 |
---|---|---|---|---|---|
Singleton | 單例模式,默認作用域,整個 IoC 容器中只存在一個 Bean 實例。 | 容器啟動時創建 | 容器關閉時銷毀 | 需自行保證(如無狀態設計或加鎖) | 無狀態服務(如工具類、配置類、Service 層) |
Prototype | 多例模式,每次請求(getBean() ?或依賴注入)都會創建一個新的 Bean 實例。 | 每次調用時創建 | Spring 不管理,依賴 JVM 垃圾回收銷毀 | 默認安全(每個實例獨立) | 有狀態對象(如用戶會話、線程上下文) |
Request | 每個 HTTP 請求創建一個新的 Bean 實例(僅適用于 Web 應用)。 | 每次 HTTP 請求時創建 | 請求結束時銷毀 | 安全(每個請求獨立實例) | 請求級數據(如用戶表單提交、臨時計算) |
Session | 每個用戶會話(Session)創建一個 Bean 實例(僅適用于 Web 應用)。 | 用戶首次訪問時創建 | 會話超時或失效時銷毀 | 安全(每個會話獨立實例) | 用戶級數據(如購物車、登錄狀態) |
9、相關的注解有哪些?各自作用?
- @Configuration
- @ComponentScan
- @Component
- @Bean
- @Lazy
- @Scope
- @PostConstruct
- @PreDestroy
- @Data
- @Getter
- @Setter
- @Test
Spring 核心注解
注解 | 作用 | 示例/備注 |
---|---|---|
@Configuration | 標記類為配置類,定義 Spring 容器配置(替代 XML)。 | java @Configuration public class AppConfig { ... } |
@ComponentScan | 自動掃描指定包下的組件(@Component 、@Service ?等)。 | java @ComponentScan("com.example") |
@Component | 通用注解,標記類為 Spring 管理的 Bean(泛化角色)。 | java @Component public class MyBean { ... } |
@Bean | 在配置類中定義方法返回值作為 Bean(常用于第三方庫集成)。 | java @Bean public DataSource dataSource() { return new HikariDataSource(); } |
@Lazy | 延遲初始化 Bean(首次使用時創建,默認單例模式立即初始化)。 | java @Lazy @Service public class LazyService { ... } |
@Scope | 指定 Bean 的作用域(如?singleton 、prototype 、request )。 | java @Scope("prototype") @Component public class UserSession { ... } |
生命周期回調注解
注解 | 作用 | 示例/備注 |
---|---|---|
@PostConstruct | 標記方法在 Bean 初始化后執行(依賴注入完成后)。 | java @PostConstruct public void init() { ... } |
@PreDestroy | 標記方法在 Bean 銷毀前執行(容器關閉時)。 | java @PreDestroy public void cleanup() { ... } |
Lombok 簡化代碼注解
注解 | 作用 | 生成代碼示例(等效代碼) |
---|---|---|
@Data | 自動生成?getter /setter 、toString() 、equals() 、hashCode() 。 | java @Data public class User { private String name; }? → 生成所有方法 |
@Getter | 僅生成?getter ?方法。 | java @Getter public class User { private String name; } |
@Setter | 僅生成?setter ?方法。 | java @Setter public class User { private String name; } |
?測試相關注解
注解 | 作用 | 示例/備注 |
---|---|---|
@Test | JUnit 測試方法標記(需 JUnit 依賴)。 | java @Test public void testMethod() { ... } |
四、Spring的DI思想
1、DI依賴注入有哪些方式?
方式一:配置文件注入(了解)
setter方法注入,有參構造注入,p命名空間注入
方式二:注解注入(最常用)
- @Autowired+@Qualifier ? ??
- @Resources ? ??
- @Value
- @Autowired+@Qualifier
- @Autowired 自動注入,默認先通過類型查找,當一個接口有多個實現類,再通過名稱查找對象
- @Qualifier和@Autowired配合使用,用于強制指定通過名稱注入
- @Value
- 給屬性注入值(適用于簡單數據類型 8種基本類型和對應的包裝類及String類型)
- @Autowired
- 自動注入(自動從spring容器中查找接口的實現類,實現注入)
-
@Resource
(JSR-250 標準) -
作用:類似于?
@Autowired
,但默認按名稱注入(找不到名稱再按類型)。 -
可用位置:字段、Setter 方法(不支持構造方法)。
-
行為:
-
如果指定?
name
,則按名稱查找 Bean。 -
如果不指定?
name
,則默認使用字段名/方法名作為 Bean 名稱查找。
-
2、DI依賴注入常用的注解有哪些?
- @Value 用于給簡單數據類型賦值(字面量)
- @Autowired + @Qualifier 給對象類型賦值
- @Resource 給對象類型賦值
3、IOC創建對象相關的注解有哪些?(對比)
- @Component 類上使用。
- @Bean 方法上使用,方法的返回值是對象,將返回的對象交給ioc容器管理。
4、@Autowired 和 @Resource的區別?
1. 來源不同
- @Autowired
???屬于 Spring 框架( org.springframework.beans.factory.annotation )。
???是 Spring 特有的注解,與其他 Spring 功能深度集成。
- @Resource
???屬于 Java 標準注解( javax.annotation.Resource ),遵循 JSR-250 規范。
???不依賴 Spring,但 Spring 對其提供了支持。
2. 默認注入方式不同
- @Autowired
- 默認按 類型(byType) 注入。
- 如果存在多個同類型的 Bean,會嘗試按 名稱(byName) 匹配(需配合 @Qualifier 指定名稱)。
- @Resource
- 默認按 名稱(byName) 注入。
- 如果未指定名稱,則退化為按類型(byType)注入。
5、建對象相關注解
- @Component 類上使用 通用的javabean
- @Bean 方法上使用,方法的返回值是對象,將返回的對象交給ioc容器管理。
- @Controller @RestController 控制層上使用@RestController=@Controller+@ResponseBody
- @Service 業務層上使用
- @Repository 持久層
五、SpringMVC
1、get和post的區別?(重點)
對比維度 | GET 請求 | POST 請求 |
---|---|---|
參數可見性 | 參數暴露在地址欄中,用戶可見 | 參數放在請求體(Body)中,用戶不可見 |
安全性 | 不安全,數據暴露在URL中,不適合傳輸敏感信息 | 相對“安全”,參數不在URL中顯示,適合傳輸敏感數據 |
編碼方式 | 使用?URLEncoder.encode() ?進行URL編碼 | 將參數轉換為二進制流形式發送 |
數據長度限制 | 參數長度受限(通常幾KB級別),受瀏覽器和服務器限制 | 理論上無上限,實際由服務器配置決定 |
2、服務端接收前端請求的方式?(重點)
注解 | HTTP 方法 | 簡寫等價形式 | 常見用途 |
---|---|---|---|
@RequestMapping | 所有方法 | 無(需手動指定 method) | 多方法兼容的路由 |
@GetMapping | GET | @RequestMapping(method = RequestMethod.GET) | 查詢數據 |
@PostMapping | POST | @RequestMapping(method = RequestMethod.POST) | 提交數據(如表單/JSON) |
@PutMapping | PUT | @RequestMapping(method = RequestMethod.PUT) | 更新資源(全量替換) |
@DeleteMapping | DELETE | @RequestMapping(method = RequestMethod.DELETE) | 刪除資源 |
- 關鍵區別:
@RequestMapping 是通用注解,需手動指定 method,靈活性高。
@RequestMapping(value = "/user", method = RequestMethod.GET) ?// 僅處理 GET
public String getUser() { return "user"; }@RequestMapping(value = "/user", method = RequestMethod.POST) // 僅處理 POST
public String addUser() { return "added"; }
@GetMapping / @PostMapping 是專用注解,代碼更簡潔,語義更明確。
- 聯系:
- @GetMapping 和 @PostMapping 本質上是 @RequestMapping 的派生注解,底層仍調用 @RequestMapping。
- Spring 4.3 后引入這些專用注解,推薦優先使用它們以提高代碼可讀性。?
3、服務端響應數據給前端的方式?(重點)
前后端分離
對比維度 | HttpServletResponse | @ResponseBody | @RestController |
---|---|---|---|
所屬層級 | 原生 Servlet API | Spring MVC 注解 | Spring MVC 組合注解(= @Controller + @ResponseBody) |
使用方式 | 在 Controller 方法中注入并手動寫入輸出流 | 標注在方法上,Spring 自動將返回值寫入響應體 | 標注在類上,所有方法默認返回值直接寫入響應體 |
返回類型 | 可以寫入任意格式(字符串、JSON、文件流等),需手動處理 | 支持自動序列化(如 JSON、XML),基于返回對象類型 | 同 @ResponseBody |
控制粒度 | 更細粒度,可完全自定義響應內容和頭信息 | 控制粒度適中,適合統一返回結構 | 控制粒度較粗,適用于整個控制器 |
異常處理兼容性 | 需要手動處理異常輸出 | 可與 @ControllerAdvice 等配合統一處理異常 | 同 @ResponseBody |
是否支持 REST | ? 可以實現,但不夠簡潔 | ? 推薦用于單個方法的 REST 返回 | ? 推薦用于整個類的 REST 返回 |
開發效率 | 較低,需要手動操作輸出流 | 中等,Spring 自動處理序列化 | 高,簡化了代碼結構 |
適用場景 | 特殊需求(如下載文件、流式輸出、自定義協議) | 普通 REST 接口,返回 JSON/XML 數據 | 構建標準的 RESTful Web 服務 |
是否推薦使用 | 特殊場景下使用 | 推薦用于非全局 REST 接口 | 強烈推薦用于現代 RESTful 開發 |
4、轉發和重定向的區別和聯系?(擴展)
對比項 | 轉發(Forward) | 重定向(Redirect) |
---|---|---|
行為主體 | 服務端行為 | 客戶端(瀏覽器)行為 |
請求次數 | 瀏覽器只發起 1 次請求 | 瀏覽器至少發起 2 次請求 |
地址欄變化 | 瀏覽器地址欄不變 | 瀏覽器地址欄變化(顯示新 URL) |
訪問范圍 | 可轉發到當前應用的任意頁面(包括 /WEB-INF/ 下的頁面) | 不能訪問 /WEB-INF/ 下的頁面 |
跨應用/外部資源 | 不能轉發到其他應用 | 可以重定向到外部項目(如?https://example.com) |
數據傳遞 | 可以攜帶 request 作用域的數據 | 不能攜帶 request 作用域的數據(需通過 session 或 URL 參數傳遞) |
5、springmvc的內部執行流程圖(重點)
1、瀏覽器發起請求: http://localhost:8080/user/getById?id=1。
2、瀏覽器解析地址:http:// ? ? localhost ? ?8080。
3、定位到硬件服務器 ip 和 軟件服務器 8080(tomcat應用)。
4、通過8080----->部署的項目。
5、前端控制器接收請求 解析url路徑得到資源路徑 /user/getById。
6、前端控制器? ?通過調用 處理器映射器,查詢 handler是否存在。
7、如果路徑存在,返回路徑的執行鏈給前端控制器。如果不存在,返回404。
執行鏈包含了目標方法前的一系列過濾器和攔截器 目標方法路徑 及后置的過濾器和攔截器。
8、前端控制器 調用處理器適配器 請求執行handler(目標方法)。
9、處理器適配器封裝參數到目標方法的參數中(解析httpServletRequest ,調用
request.getParameter方法)。
10、執行目標handler(目標方法) 目標handler響應結果給處理器適配器(數據和視圖名)。
11、處理器是配置返回modelandview給前端控制器。
12、前端控制器,請求視圖解析器, 拼接前綴路徑和后綴路徑,得到完整的視圖名。
13、前端控制器,將model中的數據,在指定的視圖頁面上進行渲染。
14、響應結果給前端。