当前位置:   article > 正文

Spring启动流程源码分析_spring启动过程源码详解

spring启动过程源码详解

一般来说,Spring启动,就是构造ApplicationContext对象以及调用refresh()方法的过程。

类的继承关系图
在这里插入图片描述

Spring启动流程源码解析

1 创建AnnotationConfigApplicationContext对象

先调用this()即它自身无参的构造方法,再根据父类GenericApplicationContext无参构造方法,创建DefaultListableBeanFactory,即spring容器=BeanFactory。

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Appconfig.class);
  • 1

在这里插入图片描述

调用父类GenericApplicationContext的无参构造方法,创建DefaultListableBeanFactory
在这里插入图片描述

2. 创建AnnotatedBeanDefinitionReader对象

用于添加一些基础的PostProcessor,同时可以通过reader进行BeanDefinition的注册),同时对BeanFactory进行设置和添加PostProcessor(后置处理器)

  1. 给beanFactory的属性dependencyComparator添加默认值AnnotationAwareOrderComparator。它是一个Comparator,用于排序,会获取某个对象上的@Order注解或者通过实现Ordered接口所定义的值进行排序,在日常开发中可以利用这个类来进行排序。

  2. 给beanFactory的属性autowireCandidateResolver添加默认值ContextAnnotationAutowireCandidateResolver。用于解析某个Bean能不能进行自动注入,比如某个Bean的autowireCandidate属性是否等于true。在它的父类GenericTypeAwareAutowireCandidateResolver的核心方法isAutowireCandidate()中判断

  3. 定义集合beanDefs,存储BeanDefinitionHolder。给beanFactory添加一些必须的beanDefinition ,存到beanDefinitionMap集合中

    1. 给beanFactory注册一个ConfigurationClassPostProcessor的beanDefinition,并添加到集合beanDefs。它用于解析配置类,涉及到扫描。

    2. 给beanFactory注册一个AutowiredAnnotationBeanPostProcessor的beanDefinition,并添加到集合beanDefs。解析@Autowired注解。

    3. 给beanFactory注册一个CommonAnnotationBeanPostProcessor的beanDefinition,并添加到集合beanDefs ,解析@Resource注解。

    4. 给beanFactory注册一个EventListenerMethodProcessor的beanDefinition,并添加到集合beanDefs,解析@EventListener注解。

    5. 给beanFactory注册一个DefaultEventListenerFactory的beanDefinition,并添加到集合beanDefs,解析@EventListener注解。

    以下是创建AnnotatedBeanDefinitionReader的源码
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

3. 创建ClassPathBeanDefinitionScanner对象

该类用于扫描得到并注册BeanDefinition。同时为属性includeFiltersenvironmentresourceLoader设置值

在这里插入图片描述
添加默认的扫描过滤includeFilters, 扫描@ComponentScan路径下的.class文件时,默认扫描添加了@Component的类。
在这里插入图片描述

4. 将Appconfig注册成为beanDefinition

register(componentClasses);利用reader将Appconfig.class注册为BeanDefinition,类型为AnnotatedGenericBeanDefinition,并为beanDefinition设置属性。因为扫描时,是拿到Appconfig类的@ComponentScan配置的扫描路径,将目录下的.class文件扫描得到beanDefinition,而它自己本身没有被扫描成beanDefinition,所以要单独将它注册到容器中。
在这里插入图片描述

在这里插入图片描述

5. refresh()启动

该方法是容器AnnotationConfigApplicationContext的父类AbstractApplicationContext的方法
在这里插入图片描述

5.1 prepareRefresh()
  1. 记录启动时间
  2. 可以允许子容器设置一些内容到Environment中,比如AbstractRefreshableWebApplicationContextSpringMVC从web.xml中读取servlet配置的key-value存入Environment。 initPropertySources()是一个模板方法,让子类实现。
  3. 验证Environment中是否包括了必须要有的属性
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
// 验证环境变量中是否存在指定的值
getEnvironment().validateRequiredProperties();
  • 1
  • 2

在开发工具中设置,或者在spring.properties文件中设置都可以拿到
在这里插入图片描述

5.2 obtainFreshBeanFactory()

refreshBeanFactory(); 判断是否重复刷新AnnotationConfigApplicationContext不支持重复刷新,AnnotationConfigWebApplicationContext支持重复刷新。
在这里插入图片描述
AnnotationConfigApplicationContext,是SpringBoot启动类,它的父类是GenericApplicationContext,该容器只能刷新一次。该类在创建时,就调用父类无参的构造方法创建了DefaultListableBeanFactory容器。
在这里插入图片描述
AnnotationConfigWebApplicationContext,是SpringMVC的启动类,它的父类是AbstractRefreshableWebApplicationContext它可以重复刷新,如果刷新过,则先执行bean的销毁逻辑,然后销毁容器,将beanFactory的引用置空,再重新创建一个DefaultListableBeanFactory赋值给beanFactory。 该类是在调用下图的refreshBeanFactory()方法时才会创建DefaultListableBeanFactory

在这里插入图片描述

5.3 prepareBeanFactory()

该方法用于给beanFactory设置属性
在这里插入图片描述
在这里插入图片描述

  1. 设置beanFactory的类加载器

  2. 设置Spring EL表达式的默认解析器为StandardBeanExpressionResolver

  3. 设置默认的类型转换器注册器ResourceEditorRegistrar,用于注册默认的PropertyEditor。

  4. 添加Bean的后置处理器ApplicationContextAwareProcessor,用于执行Aware回调
    在这里插入图片描述

  5. 给beanFactory的属性ignoredDependencyInterface添加一些接口。

    如果接口的实现类实现了set回调方法,同时使用了@Autowired注解进行属性注入,那么在属性注入时,以及aware回调时,都会执行这个set方法。
    在这里插入图片描述

    如果这些接口的实现类开启的注入方式是byNamebyType,实现接口的set回调方法后,spring在注入属性的时候会忽略,在aware回调时才执行这个set回调方法。
    在这里插入图片描述

  6. 给beanFactory的属性resolvableDependencies添加默认值,在byType进行依赖注入时,会先从resolvableDependencies属性中根据类型找bean

    1. BeanFactory.class:当前BeanFactory对象
    2. ResourceLoader.class:当前ApplicationContext对象
    3. ApplicationEventPublisher.class:当前ApplicationContext对象
    4. ApplicationContext.class:当前ApplicationContext对象
  7. 添加Bean的后置处理器

    1. ApplicationListenerDetector,是一个BeanPostProcessor,用来判断某个Bean是不是ApplicationListener,如果是则把这个Bean添加到ApplicationContext中去,注意一个ApplicationListener只能是单例的
    2. LoadTimeWeaverAwareProcessor,是一个BeanPostProcessor,用来判断某个Bean是不是实现了LoadTimeWeaverAware接口,如果实现了则把ApplicationContext中的loadTimeWeaver回调setLoadTimeWeaver方法设置给该Bean。
  8. 添加一些单例bean到单例池
    在这里插入图片描述

    1. “environment”:Environment对象
    2. “systemProperties”:System.getProperties()返回的Map对象
    3. “systemEnvironment”:System.getenv()返回的Map对象
5.4 postProcessBeanFactory()

提供给AbstractApplicationContext的子类进行扩展,具体的子类,可以继续向BeanFactory中再添加一些东西

5.5 invokeBeanFactoryPostProcessors()

执行BeanFactoryPostProcessor

5.6 registerBeanPostProcessors()

BeanPostProcessor表示Bean的后置处理器,在bean完成创建后,是用来对Bean进行加工的;
BeanFactoryPostProcessor理解为BeanFactory的后置处理器,用来对BeanFactory进行加工的,可以拿到beanDefinition,修改它,或者再往beanFactory里面注册beanDefinition(实现接口BeanDefinitionRegistryPostProcessor 才能进行注册)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/609386
推荐阅读
相关标签
  

闽ICP备14008679号