Spring IOC Bean对象的创建总结
根据前面的介绍,可以进行Spring IOC容器创建Bean的总结:
- 调用构造函数启动,调用过程中父类会忽略调用三个
Aware
接口,BeanNameAware
,BeanClassloaderAware
,BeanFactoryAware
。 - 环境准备,
Environment
- 实现类
StandardEnvironment
,调用System.getenv()
获取系统环境变量,比如配置的java
环境变量等,调用System.getProperties()
获取到的系统属性变量,比如当前系统的名称,版本号等。
- 实现类
- 刷新容器,
AbstractApplicationContext#refresh
- 这个类是
BeanFactory
的实现类,refresh
方法是Spring IOC
容器启动的关键 - 整个
IOC
容器的生命周期都是围绕着这10几个方法进行展开的
- 这个类是
- 创建
IOC
容器并加载BeanDefinition
,调用obtainBeanFactory
方法- 创建一个默认的
BeanFactory
,DefaultListableBeanFactory
- 加载
xml
中配置的Bean
对象,调用loadBeanDefinitions
方法 - 默认会创建一个
BeanDefinitionReader
进行读取 - 创建解析器,用于
dtd
文件和xsd
文件的,默认会加载MATE-INF/spring.schemas
文件和MATE-INF/spring.handlers
文件 - 解析传入的
xml
文件,解析过程中文件资源变化:String[] -->String --> Resource[] --> Resource
,不断的调用重载的方法loadBeanDefinitions
,最终解析成Document
- 将解析的
Document
文件遍历元素Element
,会解析两种元素,一种是默认的,调用parseDefaultElement
,比如解析bean
标签,另一种是定制的,调用parseCustomElement
,比如解析contex:compent-scan
,util:map
标签等 - 解析完之后会创建一个
GenericBeanDefinition
放入beanDefinitionMap
和beanDefinitionNames
集合中
- 创建一个默认的
- 准备容器,调用
prepareBeanFactory
方法- 创建一个默认的
Spel
表达式解析器,StandardBeanExpressionResolver
- 添加一个属性编辑器的注册器,
ResourceEditorRegistrar
- 添加一个
BeanPostProcessor
实现类,ApplicationContextAwareProcessor
,用于执行6的忽略的Aware
接口 - 忽略6个
Aware
接口,EnvironmentAware
,EmbeddedValueResolverAware
,ResourceLoaderAware
,ApplicationEventPublisherAware
,MessageSourceAware
,ApplicationContextAware
- 创建一个默认的
- 执行
BeanFactoryPostProcessor
,调用invokeBeanFactoryPostProcessors
方法- 先解析传入的
BFPP
接口实现类,在解析容器中的BFPP
- 先解析
BeanDefinitionRegistryPostProcessor
接口实现,在解析BeanFactoryPostProcessor
接口实现 - 解析到
BDRPP
,就直接调用postProcessBeanDefinitionRegistry
方法,使用集合分别存储BDRPP
的接口和BFPP
的接口 - 解析时按照
PriorityOrdered
接口,Ordered
接口,无序的顺序进行解析,执行也是按照这个顺序执行 - 循环遍历执行
BDRPP
接口方法postProcessBeanDefinitionRegistry
,BFPP
的方法postProcessBeanFactory
- 遍历解析
BDRPP
时会执行到注解的解析类ConfigurationClassPostProcessor
- 解析
@Component
注解,解析@ComponentScans
、@ComponentScan
注解,解析@PropertySources
、@PropertySource
注解,解析@ImportResouce
注解,解析@Import
注解,解析@Bean
注解 - 解析完之后将解析到的
BeanDefinition
创建为GenericBeanDefinition
,然后加入到beanDefinitionMap
和beanDefinitionNames
集合中
- 解析
- 先解析传入的
- 执行
BeanPostProcessor
的注册,调用registerBeanPostProcessors
方法- 解析过程跟解析
BFPP
逻辑类似,只是BPP
只是进行了注册,调用了addBeanPostProcessor
方法
- 解析过程跟解析
- 执行国际化设置,多播器设置,监听器注册
- 执行剩余的非懒加载的单例的初始化,调用
finishBeanFactoryInitialization
方法- 加载一个转换服务,
ConversionService
,用于类型转换使用 - 添加一个默认的占位符解析器,
PropertySourcesPlaceHolderConfigurer
- 冻结
BeanDefinition
的元数据 - 实例化所有的非懒加载的单例
Bean
,调用preInstantiateSingletons
方法-
- 加载一个转换服务,
未完待续。。。。
来源:https://www.cnblogs.com/redwinter/p/16307564.html
本站部分图文来源于网络,如有侵权请联系删除。