默认情况下,Spring在读取xml文件的时候,就会创建对象。在创建对象的过程是:先调用构造器,然后有属性值调用set方法设置属性,然后调用init-method属性值中所指定的初始化方法。对象在被销毁的时候,会调用destroy-method属性值中所指定的销毁方法,写一个测试类,代码如下:
测试 bean
public class LifeBean {
private String name;
public LifeBean() {
System.out.println("LifeBean 的无参构造函数");
}
public void setName(String name) {
System.out.println("setName 方法");
this.name = name;
}
public String getName() {
return name;
}
public void init() {
System.out.println("This is init of lifeBean");
}
public void destory() {
System.out.println("This is destory of lifeBean");
}
}
applicationContext.xml
<bean id="lifeBean" class="www.xq.spring.bean.LifeBean"
init-method="init" destroy-method="destory">
<property name="name" value="lifeBean"></property>
</bean>
测试
@Test
public void testLifeBean() {
AbstractApplicationContext ctx =
new ClassPathXmlApplicationContext("applicationContext.xml");
LifeBean lifeBean = (LifeBean) ctx.getBean("lifeBean");
System.out.println(lifeBean);
//销毁 bean
ctx.close();
}
运行结果:
LifeBean 的无参构造函数
setName 方法
This is init of lifeBean
www.xq.spring.bean.LifeBean@42f93a98
This is destory of lifeBean
测试中,我们可以看spring中的bean的简单生命周期,实际上它的完整生命周期要复杂一些:
我们这里对BeanPostProcessor接口,做一个实现类,演示一下这些接口如果要在项目中自定义的话应该怎么用,生命周期的前后置处理方法的执行情况:
public class MyBeanPostProcessor implements BeanPostProcessor{
/**
* 在初始化方法之前调用,前置处理
* bean:第一步实例化的 bean 本身
* beanName:bean 在配置文件中的 id,也是 bean 在 IOC 容器中的名字
* return:需要返回前面的 bean,但是我们可以在返回之前,偷梁换柱,
* 又点像 javaweb 中的拦截器的作用
*/
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("前置处理的 beanName" + beanName);
return bean;
}
/**
* 在初始方法之后调用,后置处理
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("前置处理的 beanName" + beanName);
return bean;
}
}
applicationContext.xml
<!-- 配置 BeanPostProcessor 的实现类,不用 id,Spring 容器会自动识别 -->
<bean class="www.xq.spring.bean.MyBeanPostProcessor"></bean>
运行结果:
以上就是 Bean 在 Spring 容器中从创建到销毁的整个生命周期!