在傳統(tǒng)的Java應(yīng)用中浴井,bean的生命周期很簡(jiǎn)單壹瘟,使用Java關(guān)鍵字 new 進(jìn)行Bean 的實(shí)例化,然后該Bean 就能夠使用了掐暮。一旦bean不再被使用,則由Java自動(dòng)進(jìn)行垃圾回收政钟。
相比之下路克,Spring管理Bean的生命周期就復(fù)雜多了,正確理解Bean 的生命周期非常重要养交,因?yàn)镾pring對(duì)Bean的管理可擴(kuò)展性非常強(qiáng)精算,下面展示了一個(gè)Bean的構(gòu)造過程
Bean 的生命周期
如上圖所示,Bean 的生命周期還是比較復(fù)雜的碎连,下面來對(duì)上圖每一個(gè)步驟做文字描述:
1.Spring啟動(dòng)殖妇,查找并加載需要被Spring管理的bean,進(jìn)行Bean的實(shí)例化
2.Bean實(shí)例化后對(duì)將Bean的引入和值注入到Bean的屬性中
3.如果Bean實(shí)現(xiàn)了BeanNameAware接口的話破花,Spring將Bean的Id傳遞給setBeanName()方法
4.如果Bean實(shí)現(xiàn)了BeanFactoryAware接口的話谦趣,Spring將調(diào)用setBeanFactory()方法,將BeanFactory容器實(shí)例傳入
5.如果Bean實(shí)現(xiàn)了ApplicationContextAware接口的話座每,Spring將調(diào)用Bean的setApplicationContext()方法前鹅,將bean所在應(yīng)用上下文引用傳入進(jìn)來。
6.如果Bean實(shí)現(xiàn)了BeanPostProcessor接口峭梳,Spring就將調(diào)用他們的postProcessBeforeInitialization()方法舰绘。
7.如果Bean 實(shí)現(xiàn)了InitializingBean接口,Spring將調(diào)用他們的afterPropertiesSet()方法葱椭。類似的捂寿,如果bean使用init-method聲明了初始化方法,該方法也會(huì)被調(diào)用
8.如果Bean 實(shí)現(xiàn)了BeanPostProcessor接口孵运,Spring就將調(diào)用他們的postProcessAfterInitialization()方法秦陋。
9.此時(shí),Bean已經(jīng)準(zhǔn)備就緒治笨,可以被應(yīng)用程序使用了驳概。他們將一直駐留在應(yīng)用上下文中赤嚼,直到應(yīng)用上下文被銷毀。
10.如果bean實(shí)現(xiàn)了DisposableBean接口顺又,Spring將調(diào)用它的destory()接口方法更卒,同樣,如果bean使用了destory-method 聲明銷毀方法稚照,該方法也會(huì)被調(diào)用蹂空。
下面用實(shí)例演示Bean的生命周期
目錄結(jié)構(gòu)
1.創(chuàng)建Bean的實(shí)現(xiàn)類
在ch3應(yīng)用src目錄中,創(chuàng)建life包果录,在life包下創(chuàng)建BeanLife腌闯。在類BeanLife中有兩個(gè)方法,一個(gè)是演示初始化過程雕憔,一個(gè)演示銷毀過程。具體代碼如下:
BeanLife.java
package life;
public class BeanLife {
public void initMyself() {
System.out.println(this.getClass().getName() + "執(zhí)行自定義的初始方法");
}
public void destroyMyself() {
System.out.println(this.getClass().getName() + "執(zhí)行自定義的銷毀方法");
}
}
2.配置Bean
在Spring配置文件中糖声,使用實(shí)現(xiàn)類BeanLife配置一個(gè)id為beanLife的Bean斤彼。具體代碼如下:
<!-- 配置bean,使用init-method屬性指定的初始化方法 蘸泻,使用destroy-method屬性指定銷毀方法-->
<bean id="beanLife" class="life.BeanLife" init-method="initMyself" destroy-method="destroyMyself" />
3.測(cè)試生命周期
在ch3應(yīng)用的test包中琉苇,創(chuàng)建測(cè)試類TestLife,具體代碼如下:
TestLife.java
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import life.BeanLife;
public class TestLife {
public static void main(String[] args) {
// 初始化Spring容器悦施,加載配置文件
//為了方便演示銷毀的執(zhí)行并扇,這里使用ClassPathXmlApplicationContext實(shí)現(xiàn)類聲明容器
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("獲得對(duì)象前");
BeanLife blife = (BeanLife)ctx.getBean("beanLife");
System.out.println("獲得對(duì)象后" + blife);
ctx.close();
}
}
測(cè)試結(jié)果