Spring基础14——Bean的生命周期

时间:2023-03-08 23:00:32
Spring基础14——Bean的生命周期

1.IOC容器中的Bean的生命周期方法

SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。SpringIOC容器对Bean的生命周期进行管理的过程:

  1)通过构造器工厂方法创建Bean实例

  2)为bean的属性设置值和对其他bean的引用

  3)调用Bean的初始化方法

  4)Bean可以使用了

  5)当容器关闭时,调用Bean的销毁方法

2.验证bean的生命周期

我们可以在Spring的配置文件中声明init-method属性和destory-method属性为Bean指定初始化和销毁方法。

首先我们先创建一个Car类:

 public class Car {
public Car() {
System.out.println("Car's Constructor");
}
private String brand; public void setBrand(String brand) {
System.out.println("setBrand...");
this.brand = brand;
}
//初始化方法
public void init() {
System.out.println("init....");
}
//销毁方法
public void destory() {
System.out.println("destory.....");
} @Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
'}';
}
}

Spring配置文件

 <bean id="car" class="com.wzy.cycle.Car" init-method="init" destroy-method="destory">
<property name="brand" value="Audi"/>
</bean>

编写一个测试类对id为car的bean进行获取

 public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car);
ctx.close();
}
}

输出结果:

Spring基础14——Bean的生命周期

3.创建Bean后置处理器

Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理Bean后置处理器对IOC容器里所有Bean实例逐一处理,而非单一实例。其典型的应用就是:检查Bean属性的正确性或根据特定的标准更改bean的属性。对Bean后置处理器而言,需要实现BeanPostProcessor接口,在初始化方法被调用前后,Spring将每个Bean实例分别传递给上述接口的以下两个方法。

在BeanPostProcessor接口中包含两个方法,postProcessBeforeInitialization()和postProcessAfterInitialization():

1)postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用

2)postProcessAfterInitialization(Object bean, String beanName):init-method之后被调用

创建Bean后置处理器,首先先创建一个类并实现BeanPostProcessor接口,并实现上面两个方法:

 public class MyBeanPostProcessor implements BeanPostProcessor{
@Nullable
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization " + bean + ", " + beanName);
if ("car".equals(beanName)) {
//do sth
}
return bean;
} @Nullable
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization " + bean + ", " + beanName);
Car car = new Car();
car.setBrand("FuTe");
return car;
}
}

在spring.xml配置bean后置处理器:

 <!--实现BeanProcessor接口,并具体提供
postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用
postProcessAfterInitialization(Object bean, String beanName):init-method之后被调用
的实现
bean:bean本身
beanName:IOC容器配置的bean的名字
返回值:是实际上返回给用户的那个bean,注意:可以在以上两个方法中修改返回的bean,甚至甚至返回一个新的bean
-->
<!--配置bean的后置处理器:不需要配置id,IOC容器会自动识别是一个BeanPostProcessor-->
<bean id="myBeanPostProcessor" class="com.wzy.cycle.MyBeanPostProcessor"/>

再次运行测试类,查看输出结果:

Spring基础14——Bean的生命周期

4.添加Bean的后置处理器后Bean的生命周期

1)通过构造器或工厂方法创建bean实例

2)为bean的属性设置值和对其他bean的引用

3)将Bean实例传递给Bean后置处理器

4)执行postProcessBeforeInitialization方法

5)调用bean的init方法

6)将Bean实例传递给Bean后置处理器

7)执行postProcessAfterInitialization方法

8)bean可以使用了

9)当容器关闭了调用bean销毁方法