也來聊聊Spring中的IOC和AOP

      網友投稿 716 2025-04-01

      作為一名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

      核心概念:

      切面:對橫切關注點的抽象

      橫切關注點:對哪些方法進行攔截,攔截后進行什么樣的處理

      連接點:被攔截到的點

      切入點:對攔截點進行攔截的定義

      增強:進行攔截之后要進行的處理,分別有-前置,后置,異常,返回值,環繞

      也來聊聊Spring中的IOC和AOP

      目標對象:要進行代理的目標

      織入:將切面應用于目標對象并創建代理對象的過程

      引入:不改變代碼的前提下運行期修改類,動態添加方法或者字段

      兩種代理方式:

      JDK動態接口代理:

      要求橫切邏輯必須是接口定義的,通過反射調用目標類的代碼,動態的將橫切邏輯和業務邏輯進行編織

      CGLib動態代理:

      高性能的代碼生成類庫,不受被代理對象是否實現了接口的限制,可以默認關閉JDK動態代理而完全使用CBLib動態代理

      循環依賴問題

      Spring 為了解決單例的循環依賴問題,使用了 三級緩存 ,遞歸調用時發現 Bean 還在創建中即為循環依賴

      單例模式的 Bean 保存在如下的數據結構中:

      /** 一級緩存:用于存放完全初始化好的 bean **/ private final Map singletonObjects = new ConcurrentHashMap(256); /** 二級緩存:存放原始的 bean 對象(尚未填充屬性),用于解決循環依賴 */ private final Map earlySingletonObjects = new HashMap(16); /** 三級級緩存:存放 bean 工廠對象,用于解決循環依賴 */ private final Map> singletonFactories = new HashMap>(16); /** bean 的獲取過程:先從一級獲取,失敗再從二級、三級里面獲取 創建中狀態:是指對象已經 new 出來了但是所有的屬性均為 null 等待被 init */

      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小時內刪除侵權內容。

      上一篇:C++學習資料
      下一篇:Excel2007在同一窗口同時顯示多個工作表避免來回切換窗口(excel表格同時打開多個文檔 每次切換只能顯示一個)
      相關文章
      亚洲线精品一区二区三区| 亚洲欧洲日产国码一级毛片| 亚洲综合日韩久久成人AV| 青青青亚洲精品国产| 亚洲日韩国产欧美一区二区三区 | 亚洲午夜成人精品电影在线观看| 亚洲国产精品成人午夜在线观看| 亚洲午夜无码毛片av久久京东热| 亚洲国产乱码最新视频| 亚洲kkk4444在线观看| 中文字幕亚洲精品无码| 日本亚洲色大成网站www久久| 国产91在线|亚洲| 日本亚洲免费无线码| 亚洲熟妇自偷自拍另欧美| 亚洲精品无码高潮喷水A片软| 亚洲AV成人无码网站| 爱爱帝国亚洲一区二区三区| 国产亚洲综合视频| 亚洲第一区精品日韩在线播放| 亚洲AV无码乱码在线观看性色扶 | 亚洲综合一区二区精品久久| 综合自拍亚洲综合图不卡区| 中文字幕亚洲精品资源网| 亚洲国产成人91精品| 亚洲中文字幕日本无线码 | 亚洲综合无码精品一区二区三区| 亚洲午夜无码久久久久| 亚洲成AV人片一区二区密柚| 亚洲国产国产综合一区首页| 亚洲成无码人在线观看| 亚洲砖码砖专无区2023| 鲁死你资源站亚洲av| 亚洲国产专区一区| 亚洲中文字幕无码永久在线| 亚洲av无码一区二区三区乱子伦| 亚洲精品综合一二三区在线| 亚洲国产成人久久精品app| 亚洲中文字幕无码爆乳app| 爱情岛论坛亚洲品质自拍视频网站| 国产国拍亚洲精品福利|