1.Spring bean的生命周期概括起來就是4個階段:
(1)實例化(Spring 容器實例化bean)
(2)屬性賦值(設(shè)置bean的相關(guān)屬性和依賴)
(3)初始化
- 1.如果實現(xiàn)BeanNameAware接口,Spring 傳遞bean 的ID 到 setBeanName方法。
- 2.如果實現(xiàn)BeanFactoryAware接口,Spring傳遞beanfactory 給setBeanFactory 方法。
- 3.有任何與bean相關(guān)聯(lián)的BeanPostProcessors,Spring會在postProcesserBeforeInitialization()方法內(nèi)調(diào)用它們。
- 4.如果實現(xiàn) initializingBean接口,調(diào)用此初始化方法。
- 5.檢查是否有配置init-method方法,則執(zhí)行指定的初始化方法
- 6.如果有BeanPostProcessors 和bean 關(guān)聯(lián),這些bean的postProcessAfterInitialization() 方法將被調(diào)用。
(4)銷毀 - 1.如果實現(xiàn)DisposableBean接口,執(zhí)行dispose方法
-2.如果配置了自定義的destory-method,則執(zhí)行指定的銷毀方法

image.png
2.spring是如何解決循環(huán)依賴問題的?
(1)spring bean的初始化分為兩步:一是對象的創(chuàng)建,而是設(shè)置屬性值
(2)當創(chuàng)建A對象時,ApplicationContext.getBean()從容器中取不到A的對象,便開始創(chuàng)建對象。創(chuàng)建完后,賦屬性值b時,ApplicationContext.getBean()取不到b對象,于是去創(chuàng)建b對象。對象B創(chuàng)建完后,將半成品b賦值給A對象。然后當b對象賦值屬性a時,調(diào)用ApplicationContext.getBean()將a的屬性設(shè)置進b。