Spring 学习(十)——IOC 容器中 Bean 的生命周期

IOC 容器中 Bean 生命周期方法

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

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

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

Bean 的属性设置值和对其他 Bean 的引用

调用 Bean 的初始化方法

Bean 可以使用了

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

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

创建 Bean 后置处理器

Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.

Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.

Bean 后置处理器而言, 需要实现                                  接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:

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

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

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

Bean 的属性设置值和对其他 Bean 的引用

Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法

调用 Bean 的初始化方法

Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法

Bean 可以使用了

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

car.java

package com.hzyc.spring.bean.cycle;

/**
 * @author xuehj2016
 * @Title: Car
 * @ProjectName Spring
 * @Description: TODO
 * @date 2018/12/181:30
 */
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 destroy() {
        System.out.println("destroy...");
    }

    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                '}';
    }
}
MyBeanPostProcessor.java
package com.hzyc.spring.bean.cycle;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * @author xuehj2016
 * @Title: MyBeanPostProcessor
 * @ProjectName Spring
 * @Description: TODO
 * @date 2018/12/181:40
 */
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization : " + bean + "," + beanName);
        if("car".equals(beanName)){
            //...
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization : " + bean + "," + beanName);
        Car car = new Car();
        car.setBrand("长安");
        return car;
    }
}

 bean-cycle.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.hzyc.spring.bean.cycle.Car"
          init-method="init"
          destroy-method="destroy">
        <property name="brand" value="宝马"/>
    </bean>

    <!--实现 BeanPostProcessor 接口,并具体提供两个方法
        public Object postProcessBeforeInitialization(Object bean, String beanName)
        public Object postProcessAfterInitialization(Object bean, String beanName)
        的实现

        bean : bean 实例本身
        beanName : IOC 容器中配置 bean 的名字
        返回值 : 是实际上返回给用户的那个 bean ,注意 : 可以在以上两个方法中修改返回的 bean ,甚至返回一个新的 bean
    -->
    <!--配置 bean 的后置处理器 : 不需要配置 id ,IOC 容器自动识别为 BeanPostProcessor-->
    <bean class="com.hzyc.spring.bean.cycle.MyBeanPostProcessor"/>
</beans>

Main.java

package com.hzyc.spring.bean.cycle;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author xuehj2016
 * @Title: Main
 * @ProjectName Spring
 * @Description: TODO
 * @date 2018/12/181:35
 */
public class Main {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean-cycle.xml");

        Car car=applicationContext.getBean(Car.class);
        System.out.println(car);

        //关闭 IOC 容器
        ((ClassPathXmlApplicationContext) applicationContext).close();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41577923/article/details/85059083