IOC容器中 Bean 的生命周期的管理

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

  • 通过构造器或工厂方法创建Bean
    - 为Bean的属性设置值和对其他Bean的引用
    - 调用Bean的初始化方法
    - Bean可以使用了
    - 当容器关闭时,调用Bean的销毁方法

  • 在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法

  1. // src/com/lijunyang/model/Car.java
  2. public class Car {
  3. public Car() {
  4. System.out.println("Car`s Constructor...");
  5. }
  6. private String brand;
  7. public void setBrand(String brand) {
  8. System.out.println("setBrand...");
  9. this.brand = brand;
  10. }
  11. public void init2(){
  12. System.out.println("init...");
  13. }
  14. public void destroy(){
  15. System.out.println("destroy...");
  16. }
  17. }
  18. public class Main{
  19. public static void main(String[] args) {
  20. ClassPathXmlApplicationContext ctx =
  21. new ClassPathXmlApplicationContext("application.xml");
  22. Car car = (Car) ctx.getBean("car");
  23. System.out.println(car);
  24. // 关闭IOC容器
  25. ctx.close();
  26. }
  27. }
  28. // src/application.xml
  29. <beans>
  30. <bean id="car" class="com.lijunyang.model.Car"
  31. init-method="init2"
  32. destroy-method="destroy"
  33. >
  34. <property name="brand" value="Audi" />
  35. </bean>
  36. </beans>

配置Bean的后置管理器

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

Object postProcessBeforeInitialization(Object bean, String beanName)
Object postProcessAfterInitialization(Object bean, String beanName)

  • Spring IOC容器对Bean的生命周期进行管理的过程:

  • 通过构造器或工厂方法创建Bean
    - 为Bean的属性设置值和对其他Bean的引用
    - 将Bean实例传递给Bean后置处理方法的postProcessBeforeInitialization方法
    - 调用Bean的初始化方法
    - 将Bean实例传递给Bean后置处理方法的postProcessAfterInitialization方法
    - Bean可以使用了
    - 当容器关闭时,调用Bean的销毁方法

  1. // 在此src/application.xml文件中加入Bean
  2. <bean class="com.lijunyang.model.MyBeanPostProcessor" />
  3. // src/com/lijunyang/model/MyBeanPostProcessor.java // 创建Bean的后置处理程序
  4. public class MyBeanPostProcessor implements BeanPostProcessor {
  5. @Override
  6. public Object postProcessBeforeInitialization(Object bean, String beanName)
  7. throws BeansException {
  8. System.out.println("postProcessBeforeInitialization: " + bean + "," + beanName);
  9. if ("car".equals(beanName)) {
  10. // car...
  11. }
  12. return bean;
  13. }
  14. @Override
  15. public Object postProcessAfterInitialization(Object bean, String beanName)
  16. throws BeansException {
  17. System.out.println("postProcessAfterInitialization: " + bean + "," + beanName);
  18. // Car car = new Car(); 可以在这里改变bean的实例
  19. // car.setBrand("Ford");
  20. // return car;
  21. return bean;
  22. }
  23. }

image.png