美文网首页spring
深入理解spring中bean的生命周期

深入理解spring中bean的生命周期

作者: 今年五年级 | 来源:发表于2020-10-04 20:16 被阅读0次

核心步骤

  • 实例化 instantiaition/ɪnstænʃɪ'eɪʃən/
  • 属性赋值 populate
  • 初始化 initialization /ɪˌnɪʃəlaɪˈzeɪʃn/
  • 销毁 destruction

流程图

bean的生命周期

一起跟源码

AbstractAutowireCapableBeanFactory#createBean
AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation

此处返回的bean是null,因此不执行实例化bean前的后置处理化后方法,然后回到createBean方法,开始正式执行doCreateBean创建bean过程

AbstractAutowireCapableBeanFactory#doCreateBean

ConstructorResolver#autowireConstructor
利用反射调用构造方法实例化早期对象


然后回到AbstractAutowireCapableBeanFactory#doCreateBean方法
AbstractAutowireCapableBeanFactory#populateBean
执行InistantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法 执行InistantiationAwareBeanPostProcessor的postProcessProperties方法 bean属性赋值
AbstractAutowireCapableBeanFactory#applyPropertyValues
bean属性赋值

此时console输出

然后回到AbstractAutowireCapableBeanFactory#doCreateBean方法,开始准备初始化bean

AbstractAutowireCapableBeanFactory#三大方法

准备执行BeanPostProcessor的

  1. postProcessorsBeforeInitialization方法
  2. invokeInitMethods方法
  3. postProcessorsAfterInititalization方法
三大方法

在postProcessorsBeforeInitialization方法中会先调用afterPropertiesSet方法

调用afterPropertiesSet方法
调用close关闭容器AbstractApplicationContext#close
DefaultSingletonBeanRegistry#destroySingletons
DefaultSingletonBeanRegistry#destroyBean
bean的销毁

这里会调用下面的方法

DisposableBeanAdapter#destroy
bean的销毁

至此,整个生命周期的过程分析完毕

案例代码

BeanLifeCycleTest

public class BeanLifeCycleTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        UserBean user = (UserBean) applicationContext.getBean("userBean");
        ((AbstractApplicationContext) applicationContext).close();
    }
}

UserBean

@Component
class UserBean implements InitializingBean, BeanNameAware, DisposableBean, ApplicationContextAware {
    private int id;
    private String name;

    public UserBean(int id, String name) {
        this.id = id;
        this.name = name;
        System.out.println("2. 调用构造函数");
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
        System.out.println("5. 属性注入 id");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("5. 属性注入 name");
    }

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

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        UserBean userBean = (UserBean) applicationContext.getBean("userBean");
        System.out.println(userBean);
        System.out.println("7. 调用 BeanNameAware.setBeanName() 方法");
    }

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

    public void myInit() {
        System.out.println("10. 调用 init-method 方法");
    }

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

    public void myDestroy() {
        System.out.println("13. 调用 destroy-method 方法");
    }

    @Override
    public String toString() {
        return "UserBean{" + "id=" + id + ", name='" + name + '\'' + '}';
    }
}

MyBeanFactoryPostProcessor

@Component
class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("0. 调用 BeanFactoryPostProcessor.postProcessBeanFactory() 方法");

        String[] beanStr = beanFactory.getBeanDefinitionNames();
        for(int i=0;i<beanStr.length;++i){
            if ("userBean".equals(beanStr[i])) {
                BeanDefinition definition = beanFactory.getBeanDefinition(beanStr[i]);
                MutablePropertyValues m = definition.getPropertyValues();
                System.out.println(m);
                String beanClassName = definition.getBeanClassName();
                System.out.println(beanClassName);
                ConstructorArgumentValues constructorArgumentValues =
                        definition.getConstructorArgumentValues();
                System.out.println(constructorArgumentValues.getIndexedArgumentValues());

                if (m.contains("name")) {
                    m.addPropertyValue("name", "把名字信息修改一下");
                }
            }
        }
    }
}

MyBeanPostProcessor

@Component
class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if ("userBean".equals(beanName)) {
            System.out.println("8. 调用 BeanPostProcessor.postProcessBeforeInitialization() 方法");
        }
        return bean;
    }

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

MyInstantiationAwareBeanPostProcessor

@Component
// /ɪnstænʃɪ'eɪʃən/
class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if ("userBean".equals(beanName)) {
            System.out.println("1. 调用 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation() 方法");
        }
        return null;
    }

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

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

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        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean class="com.ln.beanlife.MyInstantiationAwareBeanPostProcessor"/>
    <bean id="userBean" class="com.ln.beanlife.UserBean" init-method="myInit"
          destroy-method="myDestroy">        <!-- 构造函数注入 -->
        <constructor-arg index="0" type="int">
            <value>1</value>
        </constructor-arg>
        <constructor-arg index="1" type="java.lang.String">
            <value>这里是构造方法name实例化</value>
        </constructor-arg>        <!-- setter方法注入 -->
        <property name="id" value="2"/>
        <property name="name" value="joker"/>
    </bean>
    <bean class="com.ln.beanlife.MyBeanPostProcessor"/>
    <bean class="com.ln.beanlife.MyBeanFactoryPostProcessor"/>
</beans>

运行结果:

BeanFactoryPostProcessor和BeanPostProcessor

推荐文章
Spring的BeanFactoryPostProcessor和BeanPostProcessor
PropertyPlaceholderConfigurer读取属性文件使用详解

相关文章

网友评论

    本文标题:深入理解spring中bean的生命周期

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