| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring Bean 生命周期 -> 正文阅读 |
|
[Java知识库]Spring Bean 生命周期 |
目录 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<String, BeanDefinition> 保存 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 同样提供了扩展点,方法为 7.2 销毁中阶段????????这个阶段是 Spring 真正销毁 bean 的阶段,会调用 bean 的销毁方法。如果xml中配置了自定义销毁方法,在DisposableBeanAdapter#invokeCustomDestroyMethod方法: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 1:53:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |