spring容器中的bean的完整生命週期一共分爲是11步
1、bean對象的實例化
2、封裝屬性,也就是設置properties中的屬性值
3、如果bean實現了BeanNameAware,則執行setBeanName方法,也就是bean中的id值
4、如果實現了BeanFactoryAware或者ApplicationContextAware,需要設置setBeanFactory或者上下文對象setApplicationContext
5、如果存在類實現BeanPostProcessor後處理bean,執行postProcessBeforeIntialization,可以在初始化之前執行一些方法
6、如果bean實現了InitializingBean,則執行afterPropertiesSet,執行屬性設置之後的操作
7、調用< bean init-method="">執行指定的初始化方法
8、如果存在類實現BeanPostProcess則執行postProcessAfterInitialization,執行初始化之後的操作
9、執行自身的業務方法
10、如果bean實現了DisposableBean,則執行spring的銷燬方法
11、調用< bean destory-method="">執行自定義的銷燬方法。
其中第五步和第八步可以結合aop,在初始化執行之前或者執行之後執行一些操作。
以上就是springbean的生命週期
代碼如下:
/**
* bean生命週期演示
*/
public class LifeCycle implements BeanNameAware, ApplicationContextAware,
InitializingBean, DisposableBean {
private String name;
public LifeCycle() {
System.out.println("第一步:實例化類");
}
public void setName(String name) {
System.out.println("第二步:設置屬性");
this.name = name;
}
@Override
public void setBeanName(String name) {
System.out.println("第三步:設置bean的名稱也就是spring容器中的" +
"名稱,也就是id值"+name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("第四步:瞭解工廠信息ApplicationContext");
}
//(此處可以加入aop)第五步執行初始化之前執行的方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("第六步:屬性設置後執行的方法");
}
public void test(){
System.out.println("第七步:執行自己配置的初始化方法");
}
//第八步執行初始化之後執行的方法(此處可以加入AOP)
public void run(){
System.out.println("第九步:執行自身的業務方法");
}
@Override
public void destroy() throws Exception {
System.out.println("第十步:執行spring的銷燬方法");
}
public void destory(){
System.out.println("第十一步:執行自己配置的銷燬方法");
}
}
指定的類實現了BeanPostProcessor可以實現aop的效果
public class MyBeanPostProcess implements BeanPostProcessor {
//處理bean,最重要的兩步
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第五步:初始化之前執行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第八步:初始化之後執行的方法");
return bean;
}
}
applicationContext.xml中的配置
<bean id="lifecycle" class="test.springbean.LifeCycle" init-method="test" destroy-method="destory">
<property name="name" value="張三"/>
</bean>
<bean class="test.springbean.MyBeanPostProcess"/>
測試
public class BeanTest {
@ Test
public void test(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext
("applicationContext.xml");
LifeCycle lifeCycle = (LifeCycle)context.getBean("lifecycle");
lifeCycle.run();
context.close();
}
}
運行結果如下:
十月 29, 2019 11:23:02 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@12f40c25: startup date [Tue Oct 29 23:23:02 GMT+08:00 2019]; root of context hierarchy
十月 29, 2019 11:23:02 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
第一步:實例化類
第二步:設置屬性
第三步:設置bean的名稱也就是spring容器中的名稱,也就是id值lifecycle
第四步:瞭解工廠信息ApplicationContext
第五步:初始化之前執行的方法
第六步:屬性設置後執行的方法
第七步:執行自己配置的初始化方法
第八步:初始化之後執行的方法
第九步:執行自身的業務方法
十月 29, 2019 11:23:02 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@12f40c25: startup date [Tue Oct 29 23:23:02 GMT+08:00 2019]; root of context hierarchy
第十步:執行spring的銷燬方法
第十一步:執行自己配置的銷燬方法
Process finished with exit code 0