一四康、生命周期流程圖:
Spring Bean的完整生命周期從創(chuàng)建Spring容器開始幔嫂,直到最終Spring容器銷毀Bean透罢,這其中包含了一系列關(guān)鍵點(diǎn)
假設(shè)一個(gè)Bean實(shí)現(xiàn)了所有的接口户矢,大的概況一下Bean的生命周期:
1.實(shí)例化BeanFactoryPostProcessor:處理的對(duì)象是BeanFactory級(jí)別
2.實(shí)例化BeanPostProcessor實(shí)現(xiàn)類
3.實(shí)例化InstantiationAwareBeanPostProcessorAdapter實(shí)現(xiàn)類,注:該類是BeanPostProcessor的擴(kuò)展
4.執(zhí)行InstantiationAwareBeanPostProcessorAdapter類的postProcessBeforeInstantiation方法
5.Bean的構(gòu)造方法
6.執(zhí)行InstantiationAwareBeanPostProcessorAdapter類的postProcessPropertyValues
7.為Bean注入屬性扫茅,即依賴注入
8.調(diào)用BeanNameAware的setBeanName方法
9.調(diào)用BeanNameAware的setBeanFactory方法
10.執(zhí)行BeanPostProcessor的后置處理器蹋嵌,postProcessAfterInitialization方法
11.調(diào)用InitializingBean的afterPropertiesSet方法
12.調(diào)用bean的init-method初始化方法
13.執(zhí)行BeanPostProcessor的postProcessAfterInitialization
14.執(zhí)行InstantiationAwareBeanPostProcessorAdapter的后置方法育瓜,postProcessAfterInitialization
15.Bean的使用
16.調(diào)用DiposibleBean的destory方法
17.調(diào)用bean指定的destory-method方法
為了上述流程的正確性葫隙,我們可以用代碼來測(cè)試一下:
測(cè)試Bean - StudentBean類:
測(cè)試Bean - StudentBean類:
/**
測(cè)試生命周期的Bean
-
Created by kxm
*/
public class StudentBean implements InitializingBean, DisposableBean, BeanNameAware, BeanFactoryAware {
private String name;
private int age;private String beanName; //實(shí)現(xiàn)了BeanNameAware接口,Spring可以將BeanName注入該屬性中
private BeanFactory beanFactory; //實(shí)現(xiàn)了BeanFactory接口躏仇,Spring可將BeanFactory注入該屬性中public StudentBean(){
System.out.println("【Bean構(gòu)造方法】學(xué)生類的無參構(gòu)造方法");
}@Override
public String toString() {
return "StudentBean{" +
"name='" + name + ''' +
", age=" + age +
", beanName='" + beanName + ''' +
'}';
}public String getName() {
return name;
}public void setName(String name) {
System.out.println("【set注入】注入學(xué)生的name屬性");
this.name = name;
}public int getAge() {
return age;
}public void setAge(int age) {
System.out.println("【set注入】注入學(xué)生的age屬性");
this.age = age;
}/**
- 自己編寫的初始化方法
*/
public void myInit(){
System.out.println("【init-method】調(diào)用init-method屬性配置的初始化方法");
}
/**
- 自己編寫的銷毀方法
*/
public void myDestroy(){
System.out.println("【destroy-method】調(diào)用destroy-method屬性配置的銷毀方法");
}
/**
- BeanFactoryAware接口的方法
- @param beanFactory
- @throws BeansException
*/
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
System.out.println("【BeanFactoryAware接口】調(diào)用BeanFactoryAware的setBeanFactory方法得到beanFactory引用");
}
/**
- BeanNameAware接口的方法
- @param name
*/
public void setBeanName(String name) {
this.beanName = name;
System.out.println("【BeanNameAware接口】調(diào)用BeanNameAware的setBeanName方法得到Bean的名稱");
}
/**
- InitializingBean接口的方法
- @throws Exception
*/
public void afterPropertiesSet() throws Exception {
System.out.println("【InitializingBean接口】調(diào)用InitializingBean接口的afterPropertiesSet方法");
}
/**
- DisposableBean接口的方法
- @throws Exception
*/
public void destroy() throws Exception {
System.out.println("【DisposableBean接口】調(diào)用DisposableBean接口的destroy方法");
}
}
MyBeanFactoryPostProcessor工廠處理器類:
- 自己編寫的初始化方法
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public MyBeanFactoryPostProcessor() {
System.out.println("【BeanFactoryPostProcessor接口】調(diào)用BeanFactoryPostProcessor實(shí)現(xiàn)類構(gòu)造方法");
}
/**
* 重寫B(tài)eanFactoryPostProcessor接口的postProcessBeanFactory方法恋脚,可通過該方法對(duì)beanFactory進(jìn)行設(shè)置
*/
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
System.out.println("【BeanFactoryPostProcessor接口】調(diào)用BeanFactoryPostProcessor接口的postProcessBeanFactory方法");
}
}
MyInstantiationAwareBeanPostProcessor類:
/**
一般情況下,當(dāng)我們需要實(shí)現(xiàn)InstantiationAwareBeanPostProcessor接口時(shí)焰手,是通過繼承Spring框架中InstantiationAwareBeanPostProcessor接口實(shí)現(xiàn)類
-
InstantiationAwareBeanPostProcessorAdapter這個(gè)適配器類來簡(jiǎn)化我們實(shí)現(xiàn)接口的工作
*/
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {public MyInstantiationAwareBeanPostProcessor() {
System.out.println("【InstantiationAwareBeanPostProcessor接口】調(diào)用InstantiationAwareBeanPostProcessor構(gòu)造方法");
}/**
- 實(shí)例化Bean之前調(diào)用
*/
public Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException {
System.out.println("【InstantiationAwareBeanPostProcessor接口】調(diào)用InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法");
return null;
}
/**
- 實(shí)例化Bean之后調(diào)用
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("【InstantiationAwareBeanPostProcessor接口】調(diào)用InstantiationAwareBeanPostProcessor接口的postProcessAfterInitialization方法");
return bean;
}
/**
- 設(shè)置某個(gè)屬性時(shí)調(diào)用
*/
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
throws BeansException {
System.out.println("【InstantiationAwareBeanPostProcessor接口】調(diào)用InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues方法");
return pvs;
}
}
MyBeanPostProcessor類:
- 實(shí)例化Bean之前調(diào)用
/**
-
Created by kxm
*/
public class MyBeanPostProcessor implements BeanPostProcessor {public MyBeanPostProcessor(){
System.out.println("【BeanPostProcessor接口】調(diào)用BeanPostProcessor的構(gòu)造方法");
}public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("【BeanPostProcessor接口】調(diào)用postProcessBeforeInitialization方法糟描,這里可對(duì)"+beanName+"的屬性進(jìn)行更改。");
return bean;
}public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("【BeanPostProcessor接口】調(diào)用postProcessAfterInitialization方法书妻,這里可對(duì)"+beanName+"的屬性進(jìn)行更改船响。");
return bean;
}
}
XML配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- 生命周期測(cè)試 -->
<!--配置Bean的后置處理器-->
<bean id="beanPostProcessor" class="com.my.spring.life.MyBeanPostProcessor">
</bean>
<!--配置instantiationAwareBeanPostProcessor-->
<bean id="instantiationAwareBeanPostProcessor" class="com.my.spring.life.MyInstantiationAwareBeanPostProcessor">
</bean>
<!--配置BeanFactory的后置處理器-->
<bean id="beanFactoryPostProcessor" class="com.my.spring.life.MyBeanFactoryPostProcessor">
</bean>
<bean id="studentBean" class="com.my.spring.life.StudentBean" init-method="myInit"
destroy-method="myDestroy" scope="singleton">
<property name="name" value="yanxiao"></property>
<property name="age" value="21"></property>
</bean>
</beans>
測(cè)試類:
public class TestCyclelife {
/**
* Created by yanxiao on 2016/8/1.
*/
public static void main(String[] args){
System.out.println("--------------【初始化容器】---------------");
ApplicationContext context = new ClassPathXmlApplicationContext("Springlife.xml");
System.out.println("-------------------【容器初始化成功】------------------");
//得到studentBean,并顯示其信息
StudentBean studentBean = context.getBean("studentBean",StudentBean.class);
System.out.println(studentBean);
System.out.println("--------------------【銷毀容器】----------------------");
((ClassPathXmlApplicationContext)context).registerShutdownHook();
}
}
符合上述的Bean的生命周期躲履,至此见间,Bean的生命周期問題已基本解決,不過還等待著你繼續(xù)去深入工猜。