**1. 為什么要使用 spring?**
- spring 提供 ioc 技術,容器會幫你管理依賴的對象,從而不需要自己創建和管理依賴對象了,更輕松的實現了程序的解耦。
- spring 提供了事務支持,使得事務操作變的更加方便。
- spring 提供了面向切片編程,這樣可以更方便的處理某一類的問題。
- 更方便的框架集成,spring 可以很方便的集成其他框架,比如 MyBatis、hibernate 等。
*****
**2.什么是依賴注入?**
在依賴注入中,您不必創建對象,但必須描述如何創建它們。您不是直接在代碼
中將組件和服務連接在一起,而是描述配置文件中哪些組件需要哪些服務。由 IoC
容器將它們裝配在一起。
*****
**3. 解釋一下什么是 ioc?**
ioc:Inversion of Control(中文:控制反轉)是 spring 的核心,對于 spring 框架來說,就是由 spring 來負責控制對象的生命周期和對象間的關系。
簡單來說,控制指的是當前對象對內部成員的控制權;控制反轉指的是,這種控制權不由當前對象管理了,由其他(類,第三方容器)來管理。
*****
**4. spring 有哪些主要模塊?**
- spring core:框架的最基礎部分,提供 ioc 和依賴注入特性。
- spring context:構建于 core 封裝包基礎上的 context 封裝包,提供了一種框架式的對象訪問方法。
- spring dao:Data Access Object 提供了JDBC的抽象層。
- spring aop:提供了面向切面的編程實現,讓你可以自定義攔截器、切點等。
- spring Web:提供了針對 Web 開發的集成特性,例如文件上傳,利用 servlet listeners 進行 ioc 容器初始化和針對 Web 的 ApplicationContext。
-spring Web mvc:spring 中的 mvc 封裝包提供了 Web 應用的 Model-View-Controller(MVC)的實現。
*****
**5. spring 常用的注入方式有哪些?**
- setter屬性注入
- 構造方法注入
- 注解方式注入
*****
**6. spring 中的 bean 是線程安全的嗎?**
spring 中的 bean 默認是單例模式,spring 框架并沒有對單例 bean 進行多線程的封裝處理。
實際上大部分時候 spring bean 無狀態的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態的話(比如 view model 對象),那就要開發者自己去保證線程安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當于 new Bean()了,所以就可以保證線程安全了。
- 有狀態就是有數據存儲功能。
- 無狀態就是不會保存數據。
*****
**7. spring 支持幾種 bean 的作用域?**
spring 支持 5 種作用域,如下:
- singleton:spring ioc 容器中只存在一個 bean 實例,bean 以單例模式存在,是系統默認值;
- prototype:每次從容器調用 bean 時都會創建一個新的示例,既每次 getBean()相當于執行 new Bean()操作;
Web 環境下的作用域:
- request:每次 http 請求都會創建一個 bean;
- session:同一個 http session 共享一個 bean 實例;
- global-session:用于 portlet 容器,因為每個 portlet 有單獨的 session,globalsession 提供一個全局性的 http session。
注意:?使用 prototype 作用域需要慎重的思考,因為頻繁創建和銷毀 bean 會帶來很大的性能開銷。
*****
**8. spring 自動裝配 bean 有哪些方式?**
- no:默認值,表示沒有自動裝配,應使用顯式 bean 引用進行裝配。
- byName:它根據 bean 的名稱注入對象依賴項。
- byType:它根據類型注入對象依賴項。
- 構造函數:通過構造函數來注入依賴項,需要設置大量的參數。
- autodetect:容器首先通過構造函數使用 autowire 裝配,如果不能,則通過 byType 自動裝配。
*****
**9. spring 事務實現方式有哪些?**
- 聲明式事務:聲明式事務也有兩種實現方式,基于 xml 配置文件的方式和注解方式(在類上添加 @Transaction 注解)。
- 編碼方式:提供編碼的形式管理和維護事務。
*****
**10. 說一下 spring 的事務隔離?**
spring 有五大隔離級別,默認值為 ISOLATION_DEFAULT(使用數據庫的設置),其他四個隔離級別和數據庫的隔離級別一致:
- ISOLATION_DEFAULT:用底層數據庫的設置隔離級別,數據庫設置的是什么我就用什么;
- ISOLATIONREADUNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、臟讀、不可重復讀);
- ISOLATIONREADCOMMITTED:提交讀,一個事務提交后才能被其他事務讀取到(會造成幻讀、不可重復讀),SQL server 的默認級別;
- ISOLATIONREPEATABLEREAD:可重復讀,保證多次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會造成幻讀),MySQL 的默認級別;
ISOLATION_SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復讀、幻讀。
*****
**11.spring 中有多少種 IOC 容器?**
- BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類。它會在客戶端
要求時實例化 bean。
- ApplicationContext - ApplicationContext 接口擴展了 BeanFactory 接口。它 在 BeanFactory 基礎上提供了一些額外的功能。