Spring 中Bean的生命周期:大致分为五步,如果加入了BeanPostProcessor 后置处理器,则是七步。
分别是:
第一步:无参构造函数创建Bean实例
第二步:为Bean属性设值
第三步前:在Bean初始化之前执行(BeanPostProcessor#postProcessBeforeInitialization)
第三步:调用Bean的初始化方法,需要XML配置(init-method)
第三步后:在Bean初始化之后执行(BeanPostProcessor#postProcessAfterInitialization)
第四步:使用Bean
第五步:调用Bean的销毁方法,需要XML配置(destroy-method)
代码示例:
public class LifeCycleBean {
private String arg;
public LifeCycleBean() {
System.out.println("第一步:无参构造函数创建Bean实例");
}
public void initMethod() {
System.out.println("第三步:调用Bean的初始化方法,需要XML配置");
}
public void destroyMethod() {
System.out.println("第五步:调用Bean的销毁方法,需要XML配置");
}
public String getArg() {
return arg;
}
public void setArg(String arg) {
this.arg = arg;
System.out.println("第二步:为Bean属性设值");
}
}
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第三步前:在Bean初始化之前执行");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("第三步后:在Bean初始化之后执行");
return bean;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- bean definitions here -->
<bean id="lifeCycleBean" class="org.xharvard.ioc.lifecycle.LifeCycleBean" init-method="initMethod"
destroy-method="destroyMethod">
<property name="arg" value="参数" />
</bean>
<!-- BeanPostProcessor 配置 -->
<bean id="myBeanPostProcessor" class="org.xharvard.ioc.lifecycle.MyBeanPostProcessor" />
</beans>
测试:
public class LifeCycleDemo {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/context-lifecycle.xml");
context.getBean("lifeCycleBean", LifeCycleBean.class);
System.out.println("第四步:使用Bean");
//关闭容器,触发销毁动作
context.close();
}
}
输出:
第一步:无参构造函数创建Bean实例
第二步:为Bean属性设值
第三步前:在Bean初始化之前执行
第三步:调用Bean的初始化方法,需要XML配置
第三步后:在Bean初始化之后执行
第四步:使用Bean
第五步:调用Bean的销毁方法,需要XML配置