摘要:讀取定義的內容,將用戶定義的表示成,是在容器中對的抽象,記錄了配置的信息。的生命周期在初始化后,并沒有被實際的創建。工作過程當目標對象被調用時,會觸發的回調函數進行攔截。
IoC容器的實現
控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。
依賴反轉是什么依賴反轉在Spring中的體現是依賴注入。
類通過引用來進行合作,這種引用形成了類之間的依賴,如果這種依賴關系需要對象自己管理,那么代碼會產生高度的耦合,導致開發和測試上的困難。如果這種依賴的管理交給框架來做,將簡化面向對象系統的復雜性,這就是依賴的反轉。
Spring中的容器是什么容器用來管理應用中的對象和其之間的依賴關系。BeanFactory是對容器的一種抽象,ApplicationContext是其高級實現。
IoC的初始化過程整體過程分三步:
Resourece定位,也就是定位定義Bean資源的位置。Resourece的位置是多樣的,使用比較多的是FileSystemResourece。
BeanDefinition載入。讀取定義的內容,將用戶定義的Bean表示成BeanDefinition,BeanDefinition是在容器中對POJO的抽象,記錄了配置的bean信息。
向IoC容器注冊BeanDefinition,IoC用HashMap結構來維護注冊的BeanDefinition。
注意這里只是有Bean的載入,而不是依賴注入,依賴注入發生在第一次通過getBean向容器獲取Bean的時候。
依賴注入過程在發起getBean方法時,才會進行依賴注入,創建響應的bean。
依賴注入過程如下:
判斷單例bean是否已經創建,創建過的無需重復創建。
遞歸創建依賴的bean。
最后創建目標bean實例。
實例化Java對象。采用了CGLIB或者JVM反射機制來生成對象。CGLIB可以在運行期動態的生成新的class。
注入屬性依賴。
Bean的生命周期在IoC初始化后,Bean并沒有被實際的創建。在getBean后,才會有bean的實例化,bean的生命周期如下:
創建bean實例->設置bean的屬性->調用bean的初始化方法(initialization)->應用可以使用bean->容器關閉,銷毀bean
Bean的lazy init上述可知,bean會在使用時才會真正的創建,這防止了創建大量用不到的bean實例。
當然,可以通過設置參數,讓bean在IoC容器初始化完畢后就創建。
IoC感知的BeanBean一般情況下不需要知道IoC容器的存在,有時候則需要。Bean可以實現一些aware接口來獲得想要的容器屬性。
如ApplicationContextAware,可以在Bean中獲得上下文,從而在Bean中使用上下文。
AOP的實現 AOP的作用分離關注點使解決特定領域問題的代碼從業務邏輯中獨立出來。
基本概念Advice通知:描述方法調用注入的切面行為。
Pointcut切點:用來描述需要增強的方法集合。
Advisor通知器:將Advice和Pointcut結合起來。
在代理模式中,會設計一個和目標對象有著一致接口的代理對象Proxy,客戶端對目標對象的請求都會發送給代理對象,而客戶端對此毫無察覺。
該模式使得Proxy有機會對原始的對象的行為進行一定的修改,可以在執行前和執行后分別執行一定的動作,從而增強原始行為。
AopProxy的實現原理首先需要定義一些Advisor,這些Advisor定義了需要織入的增強功能,也就是涵蓋了通知的內容。然后定義ProxyFactoryBean,它將會生成目標的代理對象。在配置中,ProxyFactoryBean需要知道其代理的目標是誰,代理的接口是哪個,有哪些Advisor需要添加。
ProxyFactoryBean生成AopProxy過程:
初始化通知器鏈。通過getBean獲取通知器的bean,然后加入。ProxyFactoryBean只在第一次獲得AopProxy時初始化。
生成代理對象。
JDK生成,需要設置ClassLoader和代理接口。
CGLIB生成。
AopProxy工作過程:
當目標對象被調用時,會觸發Proxy的回調函數進行攔截。
首先獲取攔截器。從上述中初始化的通知器鏈中,遍歷并獲取匹配目標方法的通知器,然后獲取通知器對應的攔截器,該結果會被緩存。
調用器會依次迭代調用攔截器(interceptor)進行增強,最后調用目標方法。
通知器封裝為攔截器:
攔截器默認分為三類:MethodBeforeAdviceIntercepter、AfterReturn...、Throws...。
一個Advice會可能是MethodBeforeAdvice、AfterReturn...、Throws...其中的一個或者多個。
根據Advice的種類,適配器AdviceAdapter將其包裝為相應的intercepter,intercepter中的invoke方法會根據before、after或者throw將advice的增強行為放置到適當位置。適配器默認是上述的三種,可以自定義adapter注冊進來,以生成自己定制的intercepter。
調用器執行攔截器鏈的時候,遞歸過程:process(調用器)->invoke(intercepter)->process(調用器)->invoke(下一個intercepter)...->目標方法。所以intercepter會根據自己的種類在遞歸調用前或者后執行advice的方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70796.html
摘要:與容器與容器的關系為容器提供了宿主環境。容器通過初始化建立,是注冊在容器中的監聽器,當容器初始化時,監聽器會收到該事件從而發起容器的初始化。是處理請求的轉發器,從而響應的請求。接著將數據進行合并,然后將數據放入中進行暴露。 Spring MVC 與 Web IoC容器與Web容器的關系 ServletContext為IoC容器提供了宿主環境。IoC容器通過ContexLoaderLis...
摘要:構造函數注入通過調用類的構造函數,將接口實現類通過構造函數變量傳入。而在中,其使用橫切技術,將這類代碼從原屬的封裝對象中提取出來,封裝到一個可重用模塊中,稱為。 最近實習用到Spring的開發框架,但是之前沒有接觸過,因此希望利用網上的資源來學習以下。 Spring官方給出了非常全面的介紹,非常適合我這種完全的小白……在這一系列學習中,我閱讀的主要資源是5.1.2 Reference ...
摘要:我自己總結的學習的系統知識點以及面試問題,已經開源,目前已經。目前最新的版本中模塊的組件已經被廢棄掉,同時增加了用于異步響應式處理的組件。每一次請求都會產生一個新的,該僅在當前內有效。顯而易見,這種模式存在很多問題。 我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 41k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: https://githu...
摘要:會一直完善下去,歡迎建議和指導,同時也歡迎中用到了那些設計模式中用到了那些設計模式這兩個問題,在面試中比較常見。工廠設計模式使用工廠模式可以通過或創建對象。 我自己總結的Java學習的系統知識點以及面試問題,已經開源,目前已經 41k+ Star。會一直完善下去,歡迎建議和指導,同時也歡迎Star: https://github.com/Snailclimb... JDK 中用到了那...
摘要:開頭正式開啟我入職的里程,現在已是工作了一個星期了,這個星期算是我入職的過渡期,算是知道了學校生活和工作的差距了,總之,盡快習慣這種生活吧。當時是看的廖雪峰的博客自己也用做爬蟲寫過幾篇博客,不過有些是在前人的基礎上寫的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 開頭 2017.08.21 正式開啟我...
閱讀 2155·2021-11-12 10:36
閱讀 2147·2021-09-03 10:41
閱讀 2761·2021-08-19 10:57
閱讀 1230·2021-08-17 10:14
閱讀 1487·2019-08-30 15:53
閱讀 1210·2019-08-30 15:43
閱讀 975·2019-08-30 13:16
閱讀 2983·2019-08-29 16:56