Spring中的Bean對(duì)象通過(guò)繼承一系列接口,以及在ApplicationContext.xml文件中配置饰迹,可以形成其從初始化到結(jié)束銷毀生命周期,這些生命周期方法,可以構(gòu)成Bean的生命周期赦颇,大致記住這些方法,將在以后的開(kāi)發(fā)中事半功倍赴涵,特地再次記錄媒怯,方便日后查看.新手學(xué)習(xí),如有錯(cuò)誤髓窜,還望指出扇苞,謝謝!
Setp 1:Bean的無(wú)參構(gòu)造方法
在之前首先執(zhí)行的是Bean的無(wú)參構(gòu)造方法
public IServiceImpl() {
System.out.println("Step 1:執(zhí)行了Bean的無(wú)參構(gòu)造器方法");
}
Step 2:執(zhí)行了Bean中的set方法
Bean中可以通過(guò)注冊(cè)bean標(biāo)簽的時(shí)候設(shè)置屬性值,如下面的代碼示例中纱烘,其屬性為name杨拐,設(shè)置參數(shù)是NameValue,但是前提條件要求Bean類的代碼中含有SetName()這個(gè)方法擂啥。
<bean id="servicesImpl" class="com.zhoutao.service.IServiceImpl"
init-method="initFunction"
destroy-method="overFunction">
<!--設(shè)置Bean中的屬性值-->
<property name="name" value="NameValue"></property>
</bean>
其代碼如下:
private String name;
public void setName(String name) {
this.name = name;
System.out.println("Step 2:執(zhí)行了SetName方法,Bean的設(shè)置屬性方法");
}
Step 3:執(zhí)行了獲取BeanName的方法
Bean通過(guò)繼承BeanNameAware接口哄陶,可以實(shí)現(xiàn)獲取BeanName的方法,這個(gè)BeanName也就是在ApplicationContext.xml文件中生命的id,其代碼如下所示:
public interface BeanNameAware extends Aware {
void setBeanName(String name);
//結(jié)合Step2的bean注冊(cè)的內(nèi)容哺壶,那么nam的值將是servicesImpl屋吨,也就是id
}
//Bean 中繼承BeanNameAware接口之后重寫的方法
@Override
public void setBeanName(String name) {
System.out.println("Step 3:執(zhí)行了獲取BeanName的方法,此方法來(lái)自BeanNameAware,獲取到id是:"+name);
}
Step 4:執(zhí)行了獲取BeanFactory的方法
Bean通過(guò)繼承BeanFactoryAware接口,可以實(shí)現(xiàn)設(shè)置BeanFactory的方法山宾,其代碼如下所示:
public interface BeanFactoryAware extends Aware {
void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
//Bean中繼承BeanFactoryAware接口之后重寫的方法
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("Step 4:執(zhí)行了獲取BeanFactory的方法,此方法來(lái)自BeanFactoryAware接口");
}
Setp 5:執(zhí)行了Bean后處理器中初始化
首先看一下Bean后處理器類的寫法至扰,其繼承了BeanPostProcessor接口,實(shí)現(xiàn)了其兩個(gè)方法:
- postProcessBeforeInitialization(Object bean, String beanName)
- postProcessAfterInitialization(final Object bean, String beanName)
這兩個(gè)方法將分別在Bean初始化完成和初始化之后調(diào)用资锰。
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Setp 5:執(zhí)行了Bean后處理器中的方法:postProcessBeforeInitialization");
return bean;
}
//.......
}
Step 6:Bean初始化完成,此方法來(lái)自InitializingBean接口
在Bean初始化完成之后敢课,如果Bean繼承了InitializingBean接口,那么將會(huì)調(diào)用其接口的方法void afterPropertiesSet()
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Step 6:Bean初始化完成,此方法來(lái)自InitializingBean接口");
}
Setp 7: 執(zhí)行了Bean的初始化方法
在定義Bean的時(shí)候,我們可以通過(guò)設(shè)置屬性來(lái)設(shè)置在Bean初始化完成和銷毀之后的執(zhí)行方法直秆,代碼參照Setp2的xml文件
- init-method="initFunction" 初始化方法
- destroy-method="overFunction" 銷毀方法
此方法定義與ApplicationContext.xml文件中定義,這里由于我把這兩個(gè)函數(shù)的聲明寫在了Bean繼承的接口中濒募,因此會(huì)出現(xiàn)@Override注解,自己隨意寫一個(gè)方法也可圾结,但一定要在ApplicationContext.xml文件中聲明注冊(cè)瑰剃,其代碼如下所示:
@Override
public void initFunction() {
System.out.println("Setp 7:執(zhí)行了Bean的初始化方法,此方法定義與ApplicationContext.xml文件中dingyi");
}
Setp 8:執(zhí)行了Bean后處理器中的初始化完成方法
參照Step 5
public class MyBeanPostProcessor implements BeanPostProcessor {
//......
@Override
public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
System.out.println("Setp 8:執(zhí)行了Bean后處理器中的方法:postProcessAfterInitialization");
return bean;
}
}
Step 9:執(zhí)行Bean的業(yè)務(wù)方法
Bean的業(yè)務(wù)方法,是定義在Bean中的方法筝野,這個(gè)隨意晌姚,此方法才是我們執(zhí)行需要做的事情的方法
@Override
public String doExecute(String name) {
System.out.println("Step 9:執(zhí)行Bean的核心方法");
return "zhoutao";
}
Step 10:Bean進(jìn)行銷毀,此方法來(lái)自DisposableBean接口
@Override
public void destroy() throws Exception {
System.out.println("Step 10:Bean進(jìn)行銷毀,此方法來(lái)自DisposableBean接口");
}
Setp 11:執(zhí)行了Bean的結(jié)束方法
參照Setp 7,注意在測(cè)試類中需要調(diào)用容器的Close方法歇竟,才會(huì)調(diào)用本方法挥唠,否則不會(huì)調(diào)用,但是我們一般使用的容器是ApplicationContext途蒋,其沒(méi)有close方法猛遍,可以強(qiáng)轉(zhuǎn)為ClassPathXmlApplicationContext,然后調(diào)用close方法
@Override
public void overFunction() {
System.out.println("Setp 11:執(zhí)行了Bean的結(jié)束方法");
}
新手學(xué)習(xí)号坡,如有錯(cuò)誤懊烤,還望指出,謝謝宽堆!
本人博客原文鏈接腌紧,歡迎交流
本博客內(nèi)容一致同步到本人的博客站點(diǎn):http://www.zhoutaotao.xyz 歡迎訪問(wèn)留言交流