Spring Bean 生命周期

Spring Bean 生命周期,第1张

目录

1.元信息配置阶段

2.元信息解析阶段(封装BeanDefinition)

3.Bean注册阶段

​4.实例化阶段

5.属性赋值阶段

6.初始化阶段

6.1 Aware接口回调阶段

6.2 实例化前置增强阶段

6.3 调用初始化

​6.4 实例化后置增强阶段

7.销毁阶段

7.1 销毁前阶段

7.2 销毁中阶段


1.元信息配置阶段

        Spring 最早支持在 xml 中配置 Bean 的元信息,这些 bean 元信息的配置都处于资源文件中,由于需要大量手工配置,因此目前使用比较多的是注解,配合类扫描使我们不必将配置元信息限制在某一文件中。     

2.元信息解析阶段(封装BeanDefinition)

        存储在xml中的信息Spring需要先读取,然后将读取到的元信息封装到一个Java对象中,这个对象就是BeanDefinition。读取时用到了BeanDefinitionReader这个类,详细类图如下: 

        AbstractBeanDefinitionReader 将各种资源转换为 Resource,其子类分别从 Resource 中解析 bean,XmlBeanDefinitionReader 用于解析 xml 文件、PropertiesBeanDefinitionReader 用于解析 properties 文件,GroovyBeanDefinitionReader 用于解析 groovy 文件,使用这种方式可以很方便的进行扩展。详细细节可见我《Spring创建BeanDefinition全流程解析(5.2.x)》这篇博文。

3.Bean注册阶段

        bean 注册是指将表示 bean 元信息的 BeanDefinition 保存在 Spring 中,Spring 注册 BeanDefinition 的类为 BeanDefinitionRegistry ,使用 BeanDefinitionReader 加载或者注册 bean 的时候便会通过 BeanDefinitionRegistry#registerBeanDefinition 方法注册 BeanDefinition,Spring 内部 BeanDefinitionRegistry 的实现是 DefaultListableBeanFactory,使用了 一个 Map 保存 BeanDefinition,其中键为 bean 的名称。

4.实例化阶段

        如果 Spring BeanFactory 中没有添加 InstantiationAwareBeanPostProcessor ,那么就会走正常的流程实例化 bean,此时需要根据参数解析出需要调用的构造方法或者工厂方法。不管是构造方法还是工厂方法最后都会委托到 InstantiationStrategy#instantiate,默认的 InstantiationStrategy 实现是 CglibSubclassingInstantiationStrategy,可用于创建 bean 时通过 Cglib 生成代理。实例化 bean 的具体代码,感兴趣的小伙伴可参见AbstractAutowireCapableBeanFactory#createBeanInstance。

5.属性赋值阶段

        实例化后需要把Bean所需要的属性值或所需要的依赖注入到Bean对象中,解决循环依赖也是在这个过程中。详细细节在AbstractAutowireCapableBeanFactory#populateBean方法中

6.初始化阶段

        Spring 初始化是指调用某些初始化的方法。

6.1 Aware接口回调阶段

        Spring BeanFactory 在 bean 初始化前首先会调用 Aware 相关的接口,代码位置为 AbstractAutowireCapableBeanFactory#invokeAwareMethods,对于 BeanFactory,会分别调用 BeanNameAware#setBeanName、BeanClassLoaderAware#setBeanClassLoader 以及 BeanFactoryAware#setBeanFactory 方法。

6.2 实例化前置增强阶段

        Bean 初始化前 Spring 将首先调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法。

6.3 调用初始化

        如果XML中配置了自定义初始化方法,那么就会调用AbstractAutowireCapableBeanFactory#invokeCustomInitMethod方法

6.4 实例化后置增强阶段

        Bean 初始化后 Spring 会调用 BeanPostProcessor 的 postProcessAfterInitialization 方法。

7.销毁阶段

        通常情况我们不会手动对 bean 进行销毁,Spring 应用上下文关闭之后才会 bean 进行自动销毁。Spring 将销毁阶段又划分为销毁前和销毁中阶段。

7.1 销毁前阶段

        为了通知到用户 Spring 将对 bean 进行销毁,Spring 同样提供了扩展点,方法为DestructionAwareBeanPostProcessor#postProcessBeforeDestruction,该方法将在 Spring 指定销毁方法前调用:

7.2 销毁中阶段

        这个阶段是 Spring 真正销毁 bean 的阶段,会调用 bean 的销毁方法。如果xml中配置了自定义销毁方法,在DisposableBeanAdapter#invokeCustomDestroyMethod方法:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/788799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存