1. 程式人生 > >spring學習教程5-spring容器管理bean的生命週期

spring學習教程5-spring容器管理bean的生命週期

例如:我們需要從容器中獲得一個Bean的物件:
1、容器建立該Bean的物件(預設呼叫無參構造器)
        2、容器給這個Bean物件注入依賴(預設是set方式)
       3、如果這個Bean已經實現了BeanNameAware介面,容器會呼叫它實現的setBeanName(String)方法,此處傳遞的就是Spring配置檔案中Bean的id值
    4、如果這個Bean已經實現了BeanFactoryAware介面,容器會呼叫它實現的setBeanFactory方法
該方法接收的引數就是容器本身(可以用這個方式來獲取其它Bean)
    5、如果這個Bean已經實現了ApplicationContextAware介面,容器會呼叫setApplicationContext方法,該步和第四步類似,ApplicationContext是BeanFactory的子介面,有更多的實現方法
    6、如果spring容器中配置了BeanPostProcessor介面的實現類,容器將會呼叫該實現類中的postProcessBeforeInitialization方法,表示可以在Bean物件執行 初始化方法之前 做點事情
    7、如果Bean在Spring配置檔案中配置了init-method屬性則會自動呼叫其配置的初始化方法
    8、如果spring容器中配置了BeanPostProcessor介面的實現類,容器將會呼叫該實現類中的postProcessAfterInitialization方法,表示可以在Bean物件執行 初始化方法之後 做點事情
    注:以上工作完成以後就可以使用這個Bean物件了
    9、當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個介面,會呼叫那個其實現的destroy()方法;
    10、最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動呼叫其配置的銷燬方法
但是一般情況下,我們定義的Bean都是些普通的類,沒有用到任何spring的介面,所以大多數時候我們只考慮Bean物件的建立、依賴注入、初始化、使用、銷燬即可,並且可以把Bean分為單例和非單例倆種情況:
單例管理的物件:
1.預設情況下,spring在讀取xml檔案的時候,就會建立物件
2.進行依賴注入,如果有依賴的話
3.會去呼叫init-method=".."屬性值中所指定的方法,如果有該配置的話
4.Bean物件可以被正常使用
5.物件在被銷燬的時候,會呼叫destroy-method="..."屬性值中所指定的方法,如果有該配置的話
注意1:呼叫container.destroy()方法會銷燬單例物件
注意2:lazy-init="true",可以讓這個Bean物件在第一次被訪問的時候建立,而不是讀取xml檔案就被建立
注意3:因為是單例,所以該物件只會被建立一次
非單例管理的物件:
1.使用這個物件的時候,spring容器會建立這個物件
2.進行依賴注入,如果有依賴的話
3.會去呼叫init-method=".."屬性值中所指定的方法,如果有該配置的話
4.Bean物件可以被正常使用
注意1:spring容器不會銷燬非單例物件
注意2:因為是非單例,所以每次使用都會建立一個新的Bean物件