百木园-与人分享,
就是让自己快乐。

Spring 源码(18)Spring IOC 容器的创建总结

Spring IOC Bean对象的创建总结

根据前面的介绍,可以进行Spring IOC容器创建Bean的总结:

  • 调用构造函数启动,调用过程中父类会忽略调用三个Aware接口,BeanNameAwareBeanClassloaderAwareBeanFactoryAware
  • 环境准备,Environment
    • 实现类StandardEnvironment,调用System.getenv()获取系统环境变量,比如配置的java环境变量等,调用System.getProperties()获取到的系统属性变量,比如当前系统的名称,版本号等。
  • 刷新容器,AbstractApplicationContext#refresh
    • 这个类是BeanFactory的实现类,refresh方法是Spring IOC容器启动的关键
    • 整个IOC容器的生命周期都是围绕着这10几个方法进行展开的
  • 创建IOC容器并加载BeanDefinition,调用obtainBeanFactory方法
    • 创建一个默认的BeanFactoryDefaultListableBeanFactory
    • 加载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-scanutil:map 标签等
    • 解析完之后会创建一个GenericBeanDefinition放入beanDefinitionMapbeanDefinitionNames集合中
  • 准备容器,调用prepareBeanFactory方法
    • 创建一个默认的Spel表达式解析器,StandardBeanExpressionResolver
    • 添加一个属性编辑器的注册器,ResourceEditorRegistrar
    • 添加一个BeanPostProcessor实现类,ApplicationContextAwareProcessor,用于执行6的忽略的Aware接口
    • 忽略6个Aware接口,EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware
  • 执行BeanFactoryPostProcessor,调用invokeBeanFactoryPostProcessors方法
    • 先解析传入的BFPP接口实现类,在解析容器中的BFPP
    • 先解析BeanDefinitionRegistryPostProcessor接口实现,在解析BeanFactoryPostProcessor接口实现
    • 解析到BDRPP,就直接调用postProcessBeanDefinitionRegistry方法,使用集合分别存储BDRPP的接口和BFPP的接口
    • 解析时按照PriorityOrdered接口,Ordered接口,无序的顺序进行解析,执行也是按照这个顺序执行
    • 循环遍历执行BDRPP接口方法postProcessBeanDefinitionRegistryBFPP的方法postProcessBeanFactory
    • 遍历解析BDRPP时会执行到注解的解析类ConfigurationClassPostProcessor
      • 解析@Component注解,解析@ComponentScans@ComponentScan注解,解析@PropertySources@PropertySource注解,解析@ImportResouce注解,解析@Import注解,解析@Bean注解
      • 解析完之后将解析到的BeanDefinition创建为GenericBeanDefinition,然后加入到beanDefinitionMapbeanDefinitionNames集合中
  • 执行BeanPostProcessor的注册,调用registerBeanPostProcessors方法
    • 解析过程跟解析BFPP逻辑类似,只是BPP只是进行了注册,调用了addBeanPostProcessor方法
  • 执行国际化设置,多播器设置,监听器注册
  • 执行剩余的非懒加载的单例的初始化,调用finishBeanFactoryInitialization方法
    • 加载一个转换服务,ConversionService,用于类型转换使用
    • 添加一个默认的占位符解析器,PropertySourcesPlaceHolderConfigurer
    • 冻结BeanDefinition的元数据
    • 实例化所有的非懒加载的单例Bean,调用preInstantiateSingletons方法

未完待续。。。。


来源:https://www.cnblogs.com/redwinter/p/16307564.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Spring 源码(18)Spring IOC 容器的创建总结

相关推荐

  • 暂无文章