spring详解-bean生命周期

Bean生命周期

在经过三篇文章的分析过后,我们对Spring容器的创建过程有了一个大致的认识:

文章一:

SpringBoot启动run方法分析: https://blog.csdn.net/okok__TXF/article/details/147009731

SpringBoot-run方法分析

文章二:

Spring分析-IOC:https://blog.csdn.net/okok__TXF/article/details/147285599

SpringIOC容器创建

文章三:

Spring分析-AOP:https://blog.csdn.net/okok__TXF/article/details/147397816

Spring分析-AOP

我们都知道是在refresh()方法里面进行的,本文就来对Bean的生命周期作一个总结,本文就不探讨具体源码了。

1.bean工厂的后处理器

invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory)

通过对该方法的源码查看调试,我们得知invokeBeanFactoryPostProcessors方法会把所有实现BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor的类进行实例化和调用

BeanDefinitionRegistryPostProcessor :: postProcessBeanDefinitionRegistry()方法:所有常规 bean 定义都已加载,但尚未实例化任何 bean。这允许在下一个后处理阶段开始之前添加更多的 bean 定义。也就是说可以增加额外的BeanDefinition。

BeanFactoryPostProcessor :: postProcessBeanFactory()方法:所有 bean 定义都已加载,但尚未实例化任何 bean。这允许覆盖或添加属性,甚至允许预先初始化 bean。也就是说可以修改BeanDefinition。

对上面两个有了这些认识,很显然就可以知道BeanDefinitionRegistryPostProcessor是先于BeanFactoryPostProcessor 一步执行的。

2.实例化单例

finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)

这个里面我们也是非常有映象了,在AbstractAutowireCapableBeanFactory :: createBean(xx)方法里面:

首先,实例化instanceWrapper = createBeanInstance(beanName, mbd, args);

然后,对指定 bean 的给定合并 bean 定义进行后处理,applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);,这个就是执行MergedBeanDefinitionPostProcessor :: postProcessMergedBeanDefinition(xxx)方法了;

其次,属性填充populateBean(beanName, mbd, instanceWrapper); 在这个属性填充里面

//1.给任何 InstantiationAwareBeanPostProcessors 修改 Bean 状态的机会。
//具体是在属性填充之前。Spring 容器会遍历所有注册的 InstantiationAwareBeanPostProcessor,
//依次调用它们的 postProcessAfterInstantiation 方法。如果任何一个处理器返回 false,
//则后续的属性填充操作(包括依赖注入和属性设置)将被跳过
InstantiationAwareBeanPostProcessor :: postProcessAfterInstantiation()

// 2.postProcessProperties
// 例如:字段注入 AutowiredAnnotationBeanPostProcessor 
// 处理带有 @Autowired 和 @Value 注解的字段,根据相应的规则进行依赖注入 --- metadata.inject
InstantiationAwareBeanPostProcessor :: postProcessProperties()

最后,执行初始化exposedObject = initializeBean(beanName, exposedObject, mbd);

//1.先后顺序:BeanNameAware;BeanClassLoaderAware;BeanFactoryAware
invokeAwareMethods(beanName, bean);
//2.Bean初始化前置处理 【@PostConstruct -- CommonAnnotationBeanPostProcessor】
BeanPostProcessor :: postProcessBeforeInitialization();
//3.初始化
/*
InitializingBean :: afterPropertiesSet()
initMethod
*/
invokeInitMethods(beanName, wrappedBean, mbd);
//4.Bean初始化后置处理【例如:生成aop代理对象】
BeanPostProcessor :: postProcessAfterInitialization

大致就是上述四步了。

3.销毁bean

按照先后顺序:

  • @PreDestroy 注解方法
  • DisposableBean#destroy()
  • 自定义 destroy-method
@Component
public class DestoryBeanDemo implements DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("【DisposableBean 接口】 销毁");
    }

    @PreDestroy
    public void preDestroy(){
        System.out.println("【@PreDestroy 注解】 销毁");
    }
}

执行容器关闭的时候,走这里

public void destroy() {
    if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
        for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
            // 1.@PreDestroy 注解方法
            processor.postProcessBeforeDestruction(this.bean, this.beanName);
        }
    }

    ...
    //2.DisposableBean接口
    ((DisposableBean) this.bean).destroy();
    ....
    //3.自定义 destroy-method
    invokeCustomDestroyMethod
}

end. contact

博客园:https://www.cnblogs.com/jackjavacpp

微信公众号:

来源链接:https://www.cnblogs.com/jackjavacpp/p/18841499

© 版权声明
THE END
支持一下吧
点赞12 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容