也來聊聊Spring中的IOC和AOP
作為一名Java開發的程序猿,spring可以說是每天都要打交道的東西,從最一開始基于xml配置文件的spring再到Spring Boot或是Spring Cloud,可以明顯感覺到的就是業務的搭建變得日益簡單,配置由復雜變得越來越輕量,甚至只需要在網頁上點一點就能初始化一個可以運行的Spring項目。網上討論Spring核心概念IOC和AOP的文章也有很多,今天我也想來聊聊在我看來Spring IOC和AOP的一些特點和使用時需要注意的地方。

IOC
IOC是構成Spring常用模塊中最核心的模塊BeanFactory使用到的最重要的技術,通過控制反轉,應用程序的配置和依賴規范可以很好的與應用程序代碼分離開。我們不再需要從一個類引用另一個類時顯式地初始化對方,而是可以單純的通過某個配置文件就能描述組成Spring應用的各個類之間的依賴關系。通過Java語言的反射功能就可以實例化各個Bean并建立他們之間的依賴關系。IOC除了這些功能以外,還提供了Bean實例緩存、生命周期管理、Bean實例代理發布、事件發布、資源裝載等等高級功能。
說起IOC,最重要的就是BeanFactory,這是面向Spring框架基礎本身的一個類,而我們的開發者更多的使用ApplicationContext。
Bean的類型有兩種,一種是單例Singleton,一種是prototype,分別會在使用的過程中共享同一個Bean或者每次分別創建不同的Bean。在Web場景下Bean還有request、session和global session三種額外的作用域。
Spring Bean的生命周期大概是:
實例化
IOC依賴注入
setBeanName
BeanFactoryAware
ApplicationContextAware
postProcessBeforeInitialization
init-method
postProcessAfterInitialization
Destory過期自動清理
Destory-method
依賴注入的四種方式:
構造器注入
setter注入
靜態工廠注入
實例工廠注入
AOP
核心概念:
切面:對橫切關注點的抽象
橫切關注點:對哪些方法進行攔截,攔截后進行什么樣的處理
連接點:被攔截到的點
切入點:對攔截點進行攔截的定義
增強:進行攔截之后要進行的處理,分別有-前置,后置,異常,返回值,環繞
目標對象:要進行代理的目標
織入:將切面應用于目標對象并創建代理對象的過程
引入:不改變代碼的前提下運行期修改類,動態添加方法或者字段
兩種代理方式:
JDK動態接口代理:
要求橫切邏輯必須是接口定義的,通過反射調用目標類的代碼,動態的將橫切邏輯和業務邏輯進行編織
CGLib動態代理:
高性能的代碼生成類庫,不受被代理對象是否實現了接口的限制,可以默認關閉JDK動態代理而完全使用CBLib動態代理
循環依賴問題
Spring 為了解決單例的循環依賴問題,使用了 三級緩存 ,遞歸調用時發現 Bean 還在創建中即為循環依賴
單例模式的 Bean 保存在如下的數據結構中:
/** 一級緩存:用于存放完全初始化好的 bean **/ private final Map
1
2
3
4
5
6
7
8
9
10
11
12
13
14
檢測循環依賴的過程如下:
A 創建過程中需要 B,于是 A 將自己放到三級緩里面 ,去實例化 B
B 實例化的時候發現需要 A,于是 B 先查一級緩存,沒有,再查二級緩存,還是沒有,再查三級緩存,找到了!
然后把三級緩存里面的這個 A 放到二級緩存里面,并刪除三級緩存里面的 A
B 順利初始化完畢,將自己放到一級緩存里面(此時B里面的A依然是創建中狀態)
然后回來接著創建 A,此時 B 已經創建結束,直接從一級緩存里面拿到 B ,然后完成創建,并將自己放到一級緩存里面
如此一來便解決了循環依賴的問題
AOP Java Spring
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。