Spring生命周期
1.先實例化Bean工廠后處理器?BeanFactoryPostProcessor(Bean工廠處理器的實例化是先于bean的實例化的)
? ? ? 該接口只有一個postProcessBeanFactory方法浑塞,將加載所有bean定義邪码,但是還沒有實例化bean总棵。
2.實例化Bean后處理器BeanPostProcessor
? ? 主要是兩個能力:
? ? (1)檢驗bean狀態(tài)是否有效竭业;
????(2)判斷bean是什么接口,然后進行set屬性废亭。應該就是api里面說的檢查標記接口进陡;
????此時亲铡,ApplicationContext 可以在它們的beans definitions自動檢測BeanPostProcessor bean并且把這些bean應用于隨后的bean創(chuàng)建髓削。
3.實例化感知的bean后處理器適配器(InstantiationAwareBeanPostProcessorAdapter)
它可以去調用三個方法:
postProcessBeforeInstantiation方法(實例化Bean之前調用)這個返回的bean也許是一個代理代替目標bean竹挡,有效地抑制目標bean的默認實例化。
postProcessAfterInitialization方法(實例化Bean之后調用)主要是對已經(jīng)實例化的bean進行一些處理立膛,比如說:可能這個bean在早期已經(jīng)實例化了又是單例揪罕,那么就銷毀這個bean用原來的bean。
postProcessPropertyValues方法(設置某個屬性時調用)這個方法是校驗需要注入的屬性是否有屬性值宝泵,并為bean注入屬性
4.執(zhí)行Bean構造器好啰,bean正式實例化
在實例化之前會先去調用postProcessBeforeInstantiation方法
在實例化之后就去調用postProcessAfterInitialization方法
在這里實例化就是調用postProcessPropertyValues去為所要實例化的bean注入屬性
注:此處使用到的是Bean后處理器適配器的方法。
5. 調用BeanNameAware接口
通過其中的setBeanName(String name)方法對工廠bean進行set name
6. 調用BeanFactoryAware接口
通過其中的setBeanFactory(BeanFactory beanFactory)方法對工廠bean進行set name
它會為bean實例提供所屬工廠的回調儿奶。但是框往,是在普通的bean屬性值填充之后,在初始化回調之前闯捎,從而獲得所屬的beanFactory并拷貝到本對象中搅窿。
作用:可以通過這個bean所屬的beanFactory檢查bean依賴的bean、beanClassLoader隙券、互斥的單例等。
7.調用Bean后處理器的postProcessBeforeInstantiation方法對屬性進行更改
8.調用InitializingBean.afterPropertiesSet() 闹司,檢查是否已經(jīng)set所有必要屬性娱仔,
之后調用<bean>的init-method屬性指定的初始化方法
9. 調用Bean后處理器的postProcessAfterInitialization對屬性進行更改
注:7、9用到的是Bean后處理器的方法游桩。
后處理器適配器與后處理器的這兩個方法分不同之處在于:
前者實在目標bean初始化之前之后調用牲迫,而后者實在任何bean實例化回掉之前之后使用
所以后處理器適配器的方法是先與后處理器的方法被調用
10.調用后處理器適配器的postProcessAfterInitialization
11. 容器初始化成功耐朴,使用bean
12. 調用DiposibleBean接口的DiposibleBean.destory()
被一個BeanFactory調用銷毀一個實例對象
destroy-method調用<bean>的destroy-method屬性指定的銷毀方法
---------------------
作者:非往
來源:CSDN
原文:https://blog.csdn.net/qq_42112846/article/details/81368862
版權聲明:本文為博主原創(chuàng)文章,轉載請附上博文鏈接盹憎!