Spring学习——ApplicationContext容器初始化过程

56 阅读2分钟
ProcessOn参考:

循环依赖图解

容器初始化图解

ApplicationContext容器初始化过程:

创建ApplicationContext的构造器内:

  • super(parent):创建ResourcePatternResolver;如果有父容器的话,setParent
  • setConfigLocations(configLocations):指定spring的配置文件;创建Environment对象
  • refresh():刷新容器
refresh()方法内的13个方法
  1. prepareRefresh():容器刷新前的准备工作

    • initPropertySources():钩子方法
    • getEnvironment().validateRequiredProperties():若制定了必须的环境变量proprties,则environment对象会去验证
    • 准备监听器和事件的集合,默认为空
  2. obtainFreshBeanFactory()

    创建容器对象及BeanDefinition对象**(Xml配置的BeanDefinition对象)**

    • 创建beanFactory对象(DefaultListableBeanFactory)

    • customizeBeanFactory(beanFactory)

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

      • DefaultBeanDefinitionDocumentReader

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

        spring6.0 是加载 4个internal类:

        ”internalConfigurationAnnotationProcessor“、

        ”internalAutowiredAnnotationProcessor“、

        ”internalEventListenerProcessor“、

        ”internalEventListenerFactory“

      • 当开启<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

    ConfigurationClassPostProcessor会解析注解(注解配置的BeanDefinition对象)

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

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

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

      • ConfigurationClassParser负责解析配置类,会解析@Component、

        @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()

  11. finishBeanFactoryInitialization(beanFactory):实例化非懒加载的所有Bean

    • 1setConversionService:设置转换器

    • addEmbeddedValueResolver:添加值解析器

    • freezeConfiguration:设置冻结标记

    • 实例化bean:

      • 实例化bean
      • applyMergedBeanDefinitionPostProcessors()
      • populateBean():填充自动注入的属性值
      • initializeBean():初始化bean
        • invokeAwareMethods:只处理实现了BeanNameAware、BeanFactoryAware、BeanClassLoaderAware 接口的类

        • applyBeanPostProcessorsBeforeInitialization():

        • invokeInitMethods:调用一些生命周期方法:afterPropertiesSet()、invokeCustomInitMethod()

      和bean的代理对象相关的

      InstantiationAwareBeanPostProcessor

  12. finishRefresh(): 完成refresh的操作。

    • clearResourceCaches:清除缓存
    • initLifecycleProcessor:创建生命周期处理器
    • 发布ContextRefreshedEvent事件
  13. resetCommonCaches():清除cache操作