1. Spring 特點
Spring 主要有如下特點:
- 輕量級:Spring 是非侵入式,其中的對象不依賴 Spring 的特定類;
- 控制反轉(IoC):通過 IoC,促進了低耦合,一個對象依賴的其他對象通過被動的方式傳遞進來,而不用該對象主動創建或查找;
- 面向切面(AOP):支持面向切面編程,將應用業務邏輯層和系統服務層分開;
- 容器:包含并管理應用對象的配置以及生命周期,此時 Spring 就相當于一個容器;
- 框架集合:能將簡單的組件進行配置,組合成為更為復雜的應用;在 Spring 中,應用對象被聲明式地組合在一個 XML 文件中;此外,Spring 也提供了事務管理、 持久化框架集成等基礎功能,將應用邏輯的開發留給開發者;
2. Spring 核心組件
Spring 是一個分層架構,主要由如下 7 大模塊所構成。Spring 模塊位于核心容器,定義了創建、配置和管理 Bean 的方式。
- Spring Core:提供 Spring 框架基本功能,主要組件是 BeanFactory,是工廠模式的實現,通過 IOC 機制將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
- Spring Context:一個配置文件,給 Spring 框架提供上下文信息,上下文包括 JNDI、EJB、電子郵件、國際化、校驗和調度等企業服務。
- Spring AOP :通過配置管理特性,Spring AOP 直接將 AOP(面向切面)功能集成到 Spring 框架。從而我們能夠十分方便的使用 Spring 框架來管理任何支持 AOP 的對象。模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用該組件,可以不依賴其他組件九江聲明性事務管理集成到應用程序中。
- Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可以用來管理異常處理和不同數據庫供應商拋出的錯誤信息。異常層次結構簡化了錯誤處理,而且極大降低了需要編寫的異常代碼數量。Spring DAO 面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
- Spring ORM:Spring 框架中插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map,這些都遵從 Spring 的通用事務和 DAO 異常層次結構;
- Spring Web:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文,所以 Spring 框架支持與 Jakarta Structs 的集成。同時該模塊還簡化了處理多部分請求以及請求參數綁定到域對象的工作。
- Spring MVC:MVC 是一個全功能的構建 Web 應用的 MVC 實現,可以通過策略接口對 MVC 框架實現高度可配置。而且 MVC 還容納了 JSP、Velocity、Tiles 等視圖技術。
3. Spring 常用注解
4. IoC 原理
4.1 定義
Spring 通過一個配置文件來描述 Bean
之間的相互依賴關系,利用 Java 的反射功能來實例化 Bean
并建立 Bean
之間的依賴關系。Spring 的 IoC 容器在完成這些底層工作的基礎上,還提供 Bean
實例緩存、生命周期管理、Bean
實例代理、事件發布、資源裝載等高級服務;
總結而言:IOC 負責創建對象、管理對象(通過依賴注入)、整合對象、配置對象以及管理對象的生命周期;
4.2 Spring 容器高層視圖
- Spring 啟動時先讀取
Bean
配置信息,并在 Spring 容器中生成一份對應的Bean
配置注冊表; - 根據上一步中生成的
Bean
配置注冊表來實例化Bean
,并裝配好Bean
之間的依賴關系; - 將實例化后的
Bean
裝載到 Spring 容器中的Bean
緩存池中,供上層的應用程序使用;
4.3 Spring Bean 的作用域及生命周期
4.3.1 作用域
Spring 中,用來組成應用程序的主體以及由 Spring IoC 容器所管理的對象叫做 Bean。簡而言之,Bean 就是由 IoC 容器來進行初始化、裝配和管理的對象。
Bean 的作用域主要有如下幾種:
- Singleton(單例)
作用域為 Singleton
,該模式在多線程下不安全,表明 IoC 容器中只會存在一個共享 Bean 實例,而且所有對 Bean 的請求,主要 id
和該 Bean 定義相匹配,那么就會返回 Bean 的同一實例。Singleton
是單例模型,即在從創建容器的同時就會自動創建一個 Bean 的對象,無論是否使用,而且 每次獲取到的對象都是同一對象。
- Prototype(原型):每次創建時使用
作用域為 Prototype
,表明一個 Bean 定義對應多個實例,該作用域中的 Bean 會導致在 每次對該 Bean 請求時均創建一個新的 Bean 實例。Prototype
是一個原型類型,在我們創建容器時并未實例化,而是當我們獲取 Bean 時才去創建一個對象,而且每次獲取到的對象都不一樣。
- Request:一次 request 一個實例
作用域為 Request
,表明在一次 HTTP
請求中,容器返回該 Bean 的同一個實例,即每個 HTTP
請求均有各自的 Bean 實例,依據某個 Bean 定義創建而成,只在基于 Web 的 Spring ApplicationContext 情形下有效。當一次 HTTP
請求處理結束時,該作用域中的 Bean 實例均被銷毀。
- Session
作用域為 Session
,表明 在一個 HTTP Session
中,容器返回該 Bean 的同一個實例,對不同的 Session
請求則創建新的實例,該 Bean
實例僅在當前 Session
內有效,只在基于 Web 的 Spring ApplicationContext 情形下有效。當一個 HTTP Session
被廢棄時,在該作用域內的 Bean 也將失效。
4.3.2 生命周期
- Spring 對 Bean 進行實例化;
- Spring 將值和 Bean 的引用注入到 Bean 對應屬性中;
- 若 Bean 實現了 BeanNameAware 接口,則 Spring 將 Bean 的 ID 傳遞給 setBeanName() 方法;
- 若 Bean 實現了 BeanFactoryAware 接口,Spring 將調用
setBeanFactory()
方法,將 Bean 所在應用引用傳入進來; - 若 Bean 實現了 ApplicationContextAware 接口,Spring 將調用
setApplicationContext()
方法,將 Bean 所在應用的引用傳入進來; - 若 Bean 實現了 BeanPostProcessor 接口,Spring 將調用
post-ProcessBeforeInitalization()
方法; - 若 Bean 實現了
InitializingBean
接口,Spring 將調用他們的after-PropertiesSet()
方法,類似地,如果 Bean 使用init-method
聲明了初始化方法,則該方法也會被調用; - 若 Bean 實現了 BeanPostProcessor 接口,Spring 將調用他們的
post-ProcessAfterInitialization()
方法; - 此時,Bean 已經準備就緒,我們就可以被應用程序使用,他們將一直駐留在應用上下文中,直到該應用被銷毀;
- 若 Bean 實現了 DisposableBean 接口,Spring 將調用它的
destory()
接口方法;同樣,若 Bean 使用destroy-method
聲明了銷毀方法,該方法也將被調用;
最后
2020年在匆匆忙忙慌慌亂亂中就這么度過了,我們迎來了新一年,互聯網的發展如此之快,技術日新月異,更新迭代成為了這個時代的代名詞,堅持下來的技術體系會越來越健壯,JVM作為如今是跳槽大廠必備的技能,如果你還沒掌握,更別提之后更新的新技術了。
更多JVM面試整理:
(img-45r23QMe-1624514493612)]
更多JVM面試整理:
[外鏈圖片轉存中…(img-Qg0vqmjZ-1624514493613)]
點擊這里免費下載“百萬級”「JVM筆記」