SpringBoot启动解析(Bean的实例化)


 

1、Bean的初始化流程:

在springboot启动这个环节,围绕着bean实例化这个主题,简单的了解下,到底spring是如何把我们的配置变量,生成对应的容器实例:
大概的流程是
1、初始化构造器(Initialize),不同构造器会有不同分工,细节在下一章节详细说明
2、初始化监听器,不同的代码块会触发不同的事件,每个事件监听器持有该监听器要负责的事件类型,并通过事件类型,决定到底要不要执行该事件,以及对应的处理逻辑
3、初始化环境变量Environment, 这里的环境变量是系统级别的,也就是我们默认class文件路径下的环境变量
4、加载Nacos配置文件:但是我们的bootstrap走的是nacos,需要通过Nacos客户端方式,获取对应的环境变量,在初始化构造器中加载nacos配置文件,大概是这个类NacosPropertySourceLocator,主要加载三种类型的配置:
NacosShareConfiguration:我们配置share的config
NacosExtensionConfiguration:扩展config
NacosApplicationConfiguration:应用级别的config,也就是在配置中心里的实体文件,加载Nacos配置中心变量,主要有三个加载逻辑:加载应用名的properties、应用名+“.”、 应用名+"-"+profile + .properties ,这一步我们的初始化环境变量基本完成
5、初始化Bean工厂BeanFactory : 包括:bean的表达式解析器、Aware组件、注册环境变量
6、生成BeanDefinition:每个bean都会对应一个BeanDefinition,可以说是bean的元数据,但是这个时候,bean只是以BeanDefinition的形式存储在应用上下文里,还没有生成相关的实例
8、初始化bean处理器:处理器包括spring内部实现的以及外部插件自实现的
9、Configuration处理器:调用Configuration增强类,这一步是把被configuration注解标记的类,生成对应的代理类,并重置BeanDefinition的class属性,所以每个被configuration标记的类,在容器中都是以代理类的形式存在
10、替换占位符:我们的类实例里的成员变量,注解会有占位符,需要把它替换成真实的值
11、排序bean处理器:三种类型 priority、Order、无序的
12、初始化和webservlet相关的bean : 实例化bean
13、初始化工厂bean
14、初始化其他类型的bean
此时,spring容器bean的实例化基本结束

2、Bean的创建过程:

通过构造器,找到构造器入参,并从容器内部找到对应Bean的实例,没有则创建依赖的Bean,是一个循环的过程,调用链如下:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM