成功從三線小公司跳進大廠漲薪8K,給大家安排上!
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
聲明瞭銷燬方法,該方法也將被呼叫;
難道這樣就夠了嗎?不,遠遠不夠!
提前多熟悉阿里往年的面試題肯定是對面試有很大的幫助的,但是作為技術性職業,手裡有實打實的技術才是你面對面試官最有用的利器,這是從內在散發出來的自信。
備戰阿里時我花的最多的時間就是在學習技術上,佔了我所有學習計劃中的百分之70,這是一些我學習期間覺得還是很不錯的一些學習筆記,以及學習視訊都是可以點選這裡免費領取的!
我為什麼要寫這篇文章呢,其實我覺得學習是不能停下腳步的,在網路上和大家一起分享,一起討論,不單單可以遇到更多一樣的人,還可以擴大自己的眼界,學習到更多的技術,我還會在csdn、部落格、掘金等網站上分享技術,這也是一種學習的方法。
今天就分享到這裡了,謝謝大家的關注,以後會分享更多的乾貨給大家!