spring的兩個核心:BeanFactory(心臟肉微,本身使用)與ApplicationContext(身軀中鼠,面向spring框架開發(fā)者)
一范抓、BeanFactory中的Bean的生命周期
? 首先看一下BeanFactory的體系結(jié)構(gòu)
對其中的幾個重要接口進(jìn)行簡單介紹
BeanFactory:主要是從容器中獲取bean類银锻,通過getBean(String beanName)
ListableBeanFactory:訪問容器中Bean的基本基本信息的若干方法,如bean的數(shù)量滚躯、bean的類型、bean的注解等
ConfigurableBeanFactory:這是一個重要的接口嘿歌,增強(qiáng)了Ioc容器的可定制性掸掏。定義了設(shè)置類裝載器、屬性編輯器宙帝、容器初始化后置處理器等方法丧凤。
AutowireCapableBeanFactory:定義了將容器中的Bean按某種規(guī)則(名稱、類型等)進(jìn)行自動裝配的方法步脓。
SingletonBeanRegistry:定義了允許在運(yùn)行期向容器注冊單實(shí)例Bean愿待、獲取注冊bean數(shù)量等方法。
BeanDefinitionRegistry:Spring配置文件中每一個<bean>節(jié)點(diǎn)元素在Spring容器里都通過一個BeanDefinition對象表示沪编,它描述了Bean的配置信息呼盆。此接口提供了向容器中手動注冊BeanDefinition對象的方法。
其次蚁廓,看一下通過 ? ?XmlBeanDefinitionReader和DefaultListableBeanFactory實(shí)現(xiàn)啟動Spring IOC容器访圃,看一下XmlBeanDefinitionReader的類繼承關(guān)系
具體實(shí)現(xiàn):
最后,bean的生命周期流程如下圖
具體過程如下:
1.調(diào)用者通過getBean()方法向spring容器請求一個Bean
2.若容器中注冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口相嵌,則在實(shí)例化Bean之前腿时,將調(diào)用接口的postProcessBeforeInstantiation()方法况脆。
3.根據(jù)容器的配置情況調(diào)用Bean構(gòu)造方法或工廠方法實(shí)例化Bean.
4.若容器注冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在實(shí)例化Bean之后批糟,調(diào)用postProcessBeforeInstantiation()方法對已經(jīng)實(shí)例化的Bean進(jìn)行“美化”格了。
5.若bean配置了屬性信息,在bean設(shè)置每個屬性之前先調(diào)用InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法徽鼎。
6.調(diào)用Bean的屬性設(shè)置方法設(shè)置屬性值盛末。
7.若Bean實(shí)現(xiàn)了org.springframework.beans.factory.BeanNameAware接口,將調(diào)用setBeanName()將配置文件中該Bean對應(yīng)的名稱設(shè)置到Bean中否淤。
8.若Bean實(shí)現(xiàn)了org.springframework.beans.factory.BeanFactoryAware,將調(diào)用setBeanFactory將BeanFactory容器實(shí)例設(shè)置到Bean中悄但。
9.若Bean裝配了org.springframework.beans.factory.config.BeanPostProcessor后處理器,則將調(diào)用postProcessBeforInstantiation()方法對Bean進(jìn)行加工處理石抡。
10.若Bean實(shí)現(xiàn)了InitializingBean接口檐嚣,則調(diào)用afterPropertiesSet()接口方法。
11.若<bean>屬性中定義了init-method啰扛,則執(zhí)行這個方法嚎京。
12.容器在此調(diào)用BeanPostProcessor的postProcessAfterInstantiation()方法再次對Bean進(jìn)行加工處理的機(jī)會。
13.若<bean>中配置了scope屬性隐解,若為prototype鞍帝,bean的后續(xù)生命周期轉(zhuǎn)給調(diào)用者;若為singleton厢漩,則將Bea放入spring IOC容器的緩存池中膜眠,并將bean應(yīng)用返回給調(diào)用者岩臣,spring繼續(xù)對這些Bean進(jìn)行后續(xù)的生命管理溜嗜。
14.當(dāng)容器銷毀后,將觸發(fā)spring對Bean后續(xù)生命周期的管理工作架谎。若Bean實(shí)現(xiàn)了DisposableBean接口炸宵,將調(diào)用destroy()方法,可以在此編寫釋放資源谷扣、記錄日志等等操作土全。
15.若<bean>設(shè)置了destroy-method指定了銷毀的方法,那么spring將執(zhí)行這個方法会涎,完成Bean資源釋放等操作裹匙。
bean的完整的生命周期調(diào)用的方法可以分為:
Bean的自身方法:如調(diào)用Bean的構(gòu)造函數(shù)實(shí)例化Bean、設(shè)置屬性末秃、init-method概页、destroy-method。
Bean級生命周期接口方法:如BeanNameAware练慕、BeanFactoryAware惰匙、InitializingBean和DisposableBean技掏,這些接口方法都是Bean類直接實(shí)現(xiàn)。
容器級生命周期接口方法:如2/4/9/12步驟中的InstantiationAwreBeanPostProcessor和BeanPostProcessor這兩個接口實(shí)現(xiàn)一般稱它們的實(shí)現(xiàn)類為“后處理器”项鬼。后處理器接口一般不有bean本身實(shí)現(xiàn)哑梳,獨(dú)立于bean,實(shí)現(xiàn)類已容器附件裝置的形式注冊到spring容器中绘盟,并通過接口反射為spring容器掃描識別鸠真。
工廠后處理器接口方法:包括AspectJWeavingEnabler、CustomAutowireConfigurer等方法龄毡。工廠后處理器也是容器級的弧哎,在應(yīng)用上下文裝配配置文件后立即調(diào)用。
二稚虎、ApplicationContext中的Bean的生命周期
流程如下:
bean的生命周期在ApplicationContext中與在BeanFactory基本一下撤嫩,只是多了圖中步驟1和10.
兩者的區(qū)別:
ApplicationContext利用java的反射機(jī)制自動識別出配置文件中定義的BeanPostProcessor、InstantiationAwareBeanPostProcessor和BeanFactoryPostProcessor蠢终,并自動將它們注冊到應(yīng)用上下文中序攘。
BeanFacotry:需要在代碼中手動調(diào)用addBeanPostProcessor()方法進(jìn)行注冊。