Bean 的生命周期从Spring容器着手实例化Bean开始,直到最终销毁Bean,这当中经过了许多关键点,每个关键点都涉及特定方法的调用,可以将这些方法大致划分为3类:
一、Bean自身的方法
构造器、属性设置、初始化方法、销毁方法
二、Bean级生命周期接口方法
BeanNameAWare提供的setBeanName方法
BeanFactoryAWare提供的setBeanFactory方法
InitializingBean提供的afterPropertiesSet方法
DisposableBean提供的destroy方法
三、容器级生命周期接口方法
BeanFactoryPostProcessor
InstantiationAwareBeanPostProcessor
BeanPostProcessor
各方法的执行顺序如下图所示
四、用代码来验证Bean的生命周期
1.新建Bean类继承BeanNameAWare,BeanFactoryAWare,InitializingBean,DisposableBean并重写类的方法
public class Car implements BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean {
private String brand;
private String color;
private Double price;
public Car(){
System.out.println("car的构造器");
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
System.out.println("对brad属性进行赋值brand="+brand);
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
System.out.println("对color属性进行赋值color="+color);
this.color = color;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
System.out.println("对price属性进行赋值price="+price);
this.price = price;
}
public void initMethod(){
System.out.println("initMethod");
}
public void destroyMethod(){
System.out.println("destroyMethod");
}
public void setBeanName(String beanId) {
// TODO Auto-generated method stub
System.out.println(beanId);
}
//获取IOC容器
public void setBeanFactory(BeanFactory factory) throws BeansException {
System.out.println(factory);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet");
}
@Override
public void destroy() throws Exception {
System.out.println("destroy");
}
}
2.新建另一个bean类让其实现容器级别的接口方法
//容器级别的生命周期方法
//不依赖于某一个bean
public class MyBeanPostProcess implements BeanPostProcessor{
@Override//参数一:bean对象,参数二:bean的id
public Object postProcessAfterInitialization(Object bean, String beanId) throws BeansException {
System.out.println("postProcessAfterInitialization");
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanId) throws BeansException {
System.out.println("postProcessBeforeInitialization");
return bean;
}
}
3.在xml文件中对这两个类进行注入
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="car" class="com.gec.bean.Car" init-method="initMethod" destroy-method="destroyMethod">
<property name="brand" value="红旗"></property>
<property name="color" value="红色"></property>
<property name="price" value="200.00"></property>
</bean>
<bean id="a" class="com.gec.bean.A"></bean>
<bean id="myBeanPost" class="com.gec.processor.MyBeanPostProcess"></bean>
</beans>
4.编写测试类查看输出结果
public class Test {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
//尝试把IOC容器关闭即销毁
((ClassPathXmlApplicationContext)ctx).registerShutdownHook();
}
}
输出结果如下所示