Spring-02 容器化初始过程

ProcessOn参考:

循环依赖图解

容器初始化图解

ApplicationContext容器初始化过程:

创建ApplicationContext的构造器内:

  • super(parent):创建ResourcePatternResolver;如果有父容器的话,setParent

  • setConfigLocations(configLocations):指定spring的配置文件;创建Environment对象

  • refresh():刷新容器

refresh()方法内的13个方法
  1. prepareRefresh():容器刷新前的准备工作

    • initPropertySources():钩子方法

    • getEnvironment().validateRequiredProperties():若制定了必须的环境变量proprties,则environment对象会去验证

    • 准备监听器和事件的集合,默认为空

  2. obtainFreshBeanFactory():

    创建容器对象及BeanDefinition对象

    • 创建beanFactory对象(DefaultListableBeanFactory)

    • customizeBeanFactory(beanFactory)

    • 读取、解析并注册BeanDefinition对象。(关键方法:doLoadBeanDefinitions() )

      • DefaultBeanDefinitionDocumentReader

      • 当开启<context: compent-scan>标签后,会获取ComponentScanBeanDefinitionParser对象来parse 此标签元素,使用ClassPathBeanDefinitionScanner实现扫描class文件获取BeanDefinition集合。parse()方法内会调用AnnotationConfigUtils.registerAnnotationConfigProcessors()加载5个internal类

      • 当开启<aop:aspectj-autoproxy/>标签后,会获取AspectJAutoProxyBeanDefinitionParser对象来parse 此标签元素,parse()方法内会调用AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary()加载AnnotationAwareAspectJAutoProxyCreator类;

  3. prepareBeanFactory(beanFactory):为beanFactory set一些属性值

    • set BeanExpressionResolver:Spel表达式解析器

    • add PropertyEditorRegistrar:value的值编辑器

    • add ApplicationContextAwareProcessor对象

    • ignoreDependencyInterface 各种Aware的class,作用是在autowired进行注入时会忽略这些接口。

    • registerResolvableDependency:

    • add ApplicationListenerDetector对象

  4. postProcessBeanFactory(beanFactory):钩子方法

  5. invokeBeanFactoryPostProcessors(beanFactory):实例化并调用所有BeanFactoryPostProcessors

    • invokeBeanDefinitionRegistryPostProcessors:处理实现了BeanDefinitionRegistryPostProcessor接口的processor。

      具体执行方法:循环执行registryProcessor.postProcessBeanDefinitionRegistry(registry)

      • ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(registry)内部会处理Configuration配置类。

      • ConfigurationClassParser负责解析配置类,会解析@PropertySource、@ComponentScan、@Import、@ImportSource、@Bean 等注解

    • invokeBeanFactoryPostProcessors:处理所有的processor。

      具体执行方法:循环执行postProcessor.postProcessBeanDefinitionRegistry(registry)

      • ConfigurationClassPostProcessor.postProcessBeanFactory(registry)方法内部执行:

        enhanceConfigurationClasses():对配置类动态代理

        add ImportAwareBeanPostProcessor 对象

  6. registerBeanPostProcessors(beanFactory):实例化并注册所有BeanPostProcessors:

    • addBeanPostProcessor postProcessor集合,实现ordered接口的需要先排序。
  7. initMessageSource():国际化

  8. initApplicationEventMulticaster():初始化事件广播器

    默认创建SimpleApplicationEventMulticaster对象

  9. onRefresh():钩子方法

  10. registerListeners():注册监听器

getApplicationEventMulticaster().addApplicationListener()

getApplicationEventMulticaster().addApplicationListenerBean()
  1. finishBeanFactoryInitialization(beanFactory):实例化非懒加载的所有Bean
*   1setConversionService:设置转换器

*   addEmbeddedValueResolver:添加值解析器

*   freezeConfiguration:设置冻结标记

*   实例化bean:

    *   实例化bean

    *   applyMergedBeanDefinitionPostProcessors()

    *   populateBean():填充自动注入的属性值

    *   initializeBean():初始化bean

        *   invokeAwareMethods:只处理实现了BeanNameAware、BeanFactoryAware、BeanClassLoaderAware 接口的类

        *   applyBeanPostProcessorsBeforeInitialization():

        *   invokeInitMethods:调用一些生命周期方法:afterPropertiesSet()、invokeCustomInitMethod()
  1. finishRefresh(): 完成refresh的操作。
*   clearResourceCaches:清除缓存

*   initLifecycleProcessor:创建生命周期处理器

*   发布ContextRefreshedEvent事件
  1. resetCommonCaches():清除cache操作
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容