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
本站部分图文来源于网络,如有侵权请联系删除。
百木园