概念:Bean生命周期歸IOC容器管理,IOC容器有兩層,Applicationcontext和Beanfactory坠七,前者面向開發(fā)者,提供了諸多豐富的api善已,后者面向底層灼捂,前者的實(shí)現(xiàn)是基于后者的。
一换团、各種接口方法分類
Bean的完整生命周期經(jīng)歷了各種方法調(diào)用悉稠,這些方法可以劃分為以下幾類:
1、Bean自身的方法 ∷野: 這個(gè)包括了Bean本身調(diào)用的方法和通過配置文件中<bean>的init-method和destroy-method指定的方法
2的猛、Bean級(jí)生命周期接口方法 : 這個(gè)包括了BeanNameAware想虎、BeanFactoryAware卦尊、InitializingBean和DiposableBean這些接口的方法
3、容器級(jí)生命周期接口方法 ∩喑: 這個(gè)包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 這兩個(gè)接口實(shí)現(xiàn)岂却,一般稱它們的實(shí)現(xiàn)類為“后處理器”。
4裙椭、工廠后處理器接口方法 □锪ā: 這個(gè)包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工廠后處理器接口的方法。工廠后處理器也是容器級(jí)的揉燃。在應(yīng)用上下文裝配配置文件之后立即調(diào)用扫尺。
二、基于BeanFactory的生命周期流轉(zhuǎn)過程:
1炊汤、首先BeanFactoryPostProcessor類正驻,是Bean工廠后處理器,是一個(gè)工廠類抢腐,用于生成容器級(jí)的BeanPostProcessor類姑曙。
2、BeanFactoryPostProcessor類的postProcessorBeanFactory方法構(gòu)造出第一個(gè)容器級(jí)的BeanPostProcessor類迈倍。
3渣磷、然后實(shí)例化了InstantiationAwareBeanPostProcessorAdapter類,該類是
InstantiationAwareBeanPostProcessor類的實(shí)現(xiàn)類
4授瘦、然后調(diào)用了InstantiationAwareBeanPostProcessor類的postProcessorBeforeInstantiation方法醋界,執(zhí)行實(shí)例化Bean之前的操作竟宋。
5、然后是執(zhí)行Bean的構(gòu)造形纺,實(shí)例化Bean丘侠,但是此時(shí)并沒有執(zhí)行指定的Bean的初始化方法(init-method),只是執(zhí)行了構(gòu)造方法逐样。
6蜗字、然后執(zhí)行InstantiationAwareBeanPostProcesser的postProcessorPropertyValue方法,即后處理器屬性賦值方法脂新,接下來就給Bean的屬性賦值挪捕,即為屬性注入,自動(dòng)執(zhí)行屬性的set方法争便,此時(shí)也沒用執(zhí)行Bean的初始化方法级零。
7、然后緊接著調(diào)用Bean級(jí)別的兩個(gè)方法BeanNameAware的setBeanName方法
和BeanFactoryAware的setBeanFactory方法滞乙。
前者為Bean賦予配置的名字奏纪,可能是xml中的id,可能是注解中指定的名字斩启,不一定是類本身的類名序调。
后者則提供了Bean的工廠方法,也不知道是干啥用的兔簇,Bean都已經(jīng)實(shí)例化了发绢。傳遞的是Spring工廠自身。
如果這個(gè)Bean已經(jīng)實(shí)現(xiàn)了ApplicationContextAware接口垄琐,會(huì)調(diào)用setApplicationContext(ApplicationContext)方法边酒,傳入Spring上下文(同樣這個(gè)方式也可以實(shí)現(xiàn)步驟4的內(nèi)容,但比4更好此虑,因?yàn)锳pplicationContext是BeanFactory的子接口,有更多的實(shí)現(xiàn)方法)口锭;(springApplicationContext創(chuàng)建Bean有該步驟朦前,BeanFactory創(chuàng)建Bean無該步驟)
8、然后另一個(gè)容器級(jí)別的類終于開始運(yùn)行了鹃操,也就是BeanPostProcessor類韭寸,調(diào)用了它的postProcessorBeforeInitialization方法,該方法名與之前另一個(gè)容器級(jí)類的方法同名荆隘。它的作用是在Bean調(diào)用初始化方法之前執(zhí)行寫好的操作恩伺。
9、然后調(diào)用Bean級(jí)別的InitializationBean的afterProtertiesSet方法椰拒,從名字上看是屬性注入后執(zhí)行的方法晶渠,嗯凰荚,從前面屬性注入后,執(zhí)行這個(gè)方法褒脯,名字起的是對(duì)的便瑟。。
10番川、然后才真正執(zhí)行Bean的初始化方法到涂,init-method是在xml或注解中指定的。
此時(shí)Bean算是真正初始化完成了颁督。
11践啄、然后是執(zhí)行容器級(jí)別的BeanPostProcessor的postProcessorAfterInitialization方法,即初始化后的后處理器執(zhí)行方法沉御。
11.5屿讽、此時(shí)若scope="prototype"归斤,則Bean返回給調(diào)用者驶兜,由調(diào)用者負(fù)責(zé)Bean的生命周期,spring不再管理這個(gè)Bean围详。
若此時(shí)scope="singleton"硫痰,則Bean放入SPringIoc容器緩存池中衩婚,并將Bean的引用返回給調(diào)用者,spring繼續(xù)對(duì)這些Bean進(jìn)行后續(xù)的管理效斑。
12非春、然后執(zhí)行InstantiationAwareBeanPostProcessor的postProcessorAfterInitialization方法,即實(shí)例化后的后處理器執(zhí)行方法缓屠。
兩個(gè)容器級(jí)類的前后的后處理器的方法名是相同的奇昙。不同的是層次不同。
一個(gè)是在Bean實(shí)例化前后執(zhí)行敌完,一個(gè)是子Bean的初始化前后執(zhí)行储耐。
實(shí)例化里面嵌套著初始化方法。
13滨溉、容器執(zhí)行成功后什湘,可以在符合一定條件后銷毀Bean,此時(shí)調(diào)用DiposibleBean的destory方法
最好調(diào)用xml或注解中指定的destory-method方法晦攒。
此時(shí)Bean生命周期結(jié)束闽撤。里面包含著容器級(jí)生命周期和Bean級(jí)生命周期。
——————————
在實(shí)例化前調(diào)用了容器級(jí)方法脯颜,實(shí)例化過程中調(diào)用的Bean級(jí)別方法哟旗。
容器級(jí)類的作用是全局的,對(duì)所有Bean都起作用,Bean級(jí)別的類在作用反復(fù)僅僅在當(dāng)前Bean闸餐。
實(shí)例化過程包括通過容器級(jí)方法注入屬性以及通過Bean級(jí)方法設(shè)置BeanName和BeanFactory饱亮。
然后初始化前調(diào)用了容器級(jí)方法,實(shí)例化過程中調(diào)用了afterProtertiesSet绎巨,即屬性注入后執(zhí)行的方法近尚,然后才是Bean級(jí)別自己的初始化方法。
初始化之后調(diào)用容器級(jí)的初始化后處理器场勤。
然后是容器級(jí)的實(shí)例化后處理器戈锻。
(后處理器可以注冊(cè)多個(gè),執(zhí)行順序必須實(shí)現(xiàn)Ordered接口和媳。)
最后符合條件后執(zhí)行Bean級(jí)別的銷毀方法格遭。
——————————————
探討:
1、Spring對(duì)Bean進(jìn)行了額外的控制留瞳,但是也使得Spring框架與Bean耦合在一起了拒迅,Spring一旦有改動(dòng),或者廢棄某些方法她倘,也許就需要修改大量代碼璧微。
因此盡可能的不用Spring提供的控制。其中對(duì)于InitializingBean和DisposableBean所實(shí)現(xiàn)的功能硬梁,與Bean自身提供的init-method和destory-method一樣前硫。使用自身提供的方法更有效的解耦。
2荧止、除非開發(fā)基于Spring之上的插件或子項(xiàng)目屹电,一般用不到Bean級(jí)別的四個(gè)接口及其方法。
BeanNameAware跃巡、BeanFactoryAware危号、InitializingBean和DisposableBean。
3素邪、而BeanPostProcessor則相當(dāng)于插件外莲,為Bean提供邏輯,并且無需實(shí)現(xiàn)且繼承兔朦。
——————————————
參考:
https://www.cnblogs.com/zrtqsk/p/3735273.html
https://blog.csdn.net/laiwenqiang/article/details/54693069
https://www.cnblogs.com/kenshinobiy/p/4652008.html
《精通SPring4.x——企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》