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