美文网首页
spring 生命周期

spring 生命周期

作者: 桑鱼nicoo | 来源:发表于2020-02-09 10:31 被阅读0次

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

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

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

    创建 bean 后置处理器

    Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理。对 IOC 容器里所有的 Bean 实例逐一处理,而非单一实例,典型的应用是:检查 Bean 属性的正确性或根据特定的标准更改Bean的属性

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

    public interface BeanPostProcessor {
        @Nullable
        default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    
        @Nullable
        default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }
    

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

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

    //applicationContext.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.sangyu.test13.Car" init-method="init" destroy-method="destory">
            <property name="brand" value="Audi"></property>
        </bean>
    
        <!--
                实现BeanPostProcessor接口,并提供具体实现
                postProcessBeforeInitialization,postProcessAfterInitialization
                bean:bean实例本身
                beanName:IOC容器配置的bean的名字
                返回值:是实际上返回给用户的那个bean,可以返回一个新的bean
    
         -->
        <!-- 配置bean的后置处理器 -->
        <bean class="com.sangyu.test13.MyBeanPostProcessor"></bean>
    </beans>
    
    // Car.java
    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 + '\'' +
                    '}';
        }
    }
    
    // Main.java
    public class Main {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    
            Car car = (Car) ctx.getBean("car");
            System.out.println(car);
            // 关闭IOC容器
            ctx.close();
        }
    }
    
    // MyBeanPostProcessor.java
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("postProcessBeforeInitialization: " + beanName + ", " + beanName );
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("postProcessAfterInitialization: " + beanName + ", " + beanName);
            Car car = new Car();
            car.setBrand("Ford");
            return car;
        }
    }
    

    相关文章

      网友评论

          本文标题:spring 生命周期

          本文链接:https://www.haomeiwen.com/subject/anguxhtx.html