Open Source, Open Future!
  menu
107 文章
ღゝ◡╹)ノ❤️

spring---bean生命周期

流程图

image.png

示例

<?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="myBeanPostProcessor" class="mncode.MyBeanPostProcessor"/>

    <bean id="myBeanFactoryPostProcessor" class="mncode.MyBeanFactoryPostProcessor"/>

    <bean id="myInstantiationAwareBeanPostProcessor" class="mncode.MyInstantiationAwareBeanPostProcessor"/>

    <bean id="product" class="mncode.Product" scope="singleton" init-method="initMethod" destroy-method="destroyMethod">
        <property name="name" value="螺丝钉"/>
    </bean>

</beans>

MyBeanFactoryPostProcessor

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("调用BeanFactoryPostProcessor的postProcessBeanFactory的方法");
    }
}

MyInstantiationAwareBeanPostProcessor

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println("调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法");
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        System.out.println("调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法");
        return true;
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
            throws BeansException {
        System.out.println("调用InstantiationAwareBeanPostProcessor的postProcessProperties方法");
        return null;
    }
}

MyBeanPostProcessor

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("调用BeanPostProcessor的postProcessBeforeInitialization方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("调用BeanPostProcessor的postProcessAfterInitialization方法");
        return bean;
    }
}

Product

public class Product implements BeanNameAware, InitializingBean, DisposableBean {

    private String name;

    public Product() {
        System.out.println("构造函数");
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("调用Product的setName方法");
    }

    public String getName() {
        return name;
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("调用BeanNameAware的setBeanName方法");
    }


    @Override
    public void afterPropertiesSet() {
        System.out.println("调用InitializingBean的afterPropertiesSet方法");
    }

    public void initMethod() {
        System.out.println("调用init-method对应的方法");
    }

    public void destroyMethod() {
        System.out.println("调用destroy-method对应的方法");
    }

    @Override
    public void destroy() {
        System.out.println("调用DisposableBean的destroy方法");
    }

}

测试

简单容器测试

    @Before
    public void init() {
        // 资源
        ClassPathResource resource = new ClassPathResource("bean.xml");
        // 创建容器
        factory = new DefaultListableBeanFactory();
        // 创建读取器
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
        // BeanDefinition载入和注册
        reader.loadBeanDefinitions(resource);
    }

    @Test
    public void test16() {
        // 简单容器不会自动注册处理器,所以这里需要手动注册
        MyBeanFactoryPostProcessor processor1 = new MyBeanFactoryPostProcessor();
        processor1.postProcessBeanFactory(factory);
        MyInstantiationAwareBeanPostProcessor processor2 = new MyInstantiationAwareBeanPostProcessor();
        factory.addBeanPostProcessor(processor2);
        MyBeanPostProcessor processor3 = new MyBeanPostProcessor();
        factory.addBeanPostProcessor(processor3);

        Product product = (Product) factory.getBean("product");
        System.out.println("商品名称:" + product.getName());

        // 销毁容器
        factory.destroySingletons();
    }

输出结果:

调用BeanFactoryPostProcessor的postProcessBeanFactory的方法
调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
构造函数
调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
调用InstantiationAwareBeanPostProcessor的postProcessProperties方法
调用Product的setName方法
调用BeanNameAware的setBeanName方法
调用BeanPostProcessor的postProcessBeforeInitialization方法
调用InitializingBean的afterPropertiesSet方法
调用init-method对应的方法
调用BeanPostProcessor的postProcessAfterInitialization方法
商品名称:螺丝钉
调用DisposableBean的destroy方法
调用destroy-method对应的方法

高级容器测试

    @Test
    public void test17() {
        // 高级容器能自动扫描处理器并注册,所以这里不需要手动注册
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        Product product = (Product) context.getBean("product");
        System.out.println("商品名称:" + product.getName());

        // 销毁容器
        context.registerShutdownHook();
    }

输出结果:

调用BeanFactoryPostProcessor的postProcessBeanFactory的方法
调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
构造函数
调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
调用InstantiationAwareBeanPostProcessor的postProcessProperties方法
调用Product的setName方法
调用BeanNameAware的setBeanName方法
调用BeanPostProcessor的postProcessBeforeInitialization方法
调用InitializingBean的afterPropertiesSet方法
调用init-method对应的方法
调用BeanPostProcessor的postProcessAfterInitialization方法
商品名称:螺丝钉
调用DisposableBean的destroy方法
调用destroy-method对应的方法

prototype模式测试

修改配置文件,将scope改为prototype

    <bean id="product" class="mncode.Product" scope="prototype" init-method="initMethod" destroy-method="destroyMethod">

        <property name="name" value="螺丝钉"/>

    </bean>

输出结果:

调用BeanFactoryPostProcessor的postProcessBeanFactory的方法
调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
构造函数
调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
调用InstantiationAwareBeanPostProcessor的postProcessProperties方法
调用Product的setName方法
调用BeanNameAware的setBeanName方法
调用BeanPostProcessor的postProcessBeforeInitialization方法
调用InitializingBean的afterPropertiesSet方法
调用init-method对应的方法
调用BeanPostProcessor的postProcessAfterInitialization方法
商品名称:螺丝钉