zoukankan      html  css  js  c++  java
  • springboot源码分析——自动配置流程

    一:ConfigurationClassPostProcessor类的埋点

      自动配置解析的核心功能都在这个类里面,这是一个BeanDefinitionRegistryPostProcessor的实现类,首先需要注册BeanDefinition,

    然后实例化对象,最后调用,我们来循序渐进的跟进一下

    1:注册ConfigurationClassPostProcessor的BeanDefinition对象

    实例化这个类对调用到类的无参数构造方法:

     

     无参数构造方法:

     

     

    2:注册启动类的配置文件 ,TestSpringbootApplication

     

     

     

     

     

     

     创建并注册BeanDefinition对象:

    3:实例化ConfigurationClassPostProcessor对象并且调用

    因为是BeanDefinitionRegistryPostProcessor接口的实现类,所以会在这个 方法实例化并调用哦

     

     

     调用到类ConfigurationClassPostProcessor类中

    二:自动配置整体流程分析

    1:如果没有任何配置

    2:加上@Configuration注解

     会发现所有的解析动作都会空跑一遍

    3:加上ComponentScan注解

     

    进入解析:parse  

     

     

    这种解析的方法doProcessConfigurationClass:

    解析ComponentScan组件:

    这样@ComponentScan组件就解析完成了

    4:加上@Import注解

     

     

     注册Import,registerImport,注册后处理processConfigurationClass,递归处理Configuration注解的类

     

     

     到这里Import类的解析完毕,包括递归解析

     

     我们来简单的看一下自动配置如何解析

    从这里开始:

    获取Import注解:

     搜集Import:

     

    注册registrar对象:

     

     注册deferImportSelector对象:

     

     

     注册并且搜集Import信息逻辑:

     

     

     

     这里又回到了最开始埋点时候的加载流程,会把所有的EnableAutoConfiguration 的key对应的values值返回

    返回之后开始处理Configuration的逻辑

    进入解析configuration注解的递归方法:

     

     到这里在spring.factories中配置项都解析完成,而且会解析每一个EnableAutoConfiguration的values项,实现注册beanDefinition。

    以JmxAutoConfiguration为例,分析一下注册流程

    解析到configuration类中有@Bean注解,需要搜集@Bean方法信息,缓存到configClass中

     

     

     解析配置类:

    当spring容器启动的时候,会解析deferImportSelector,加载所有的spring.factories文件中的配置,过滤

    递归解析configuration配置

     总结:

      自动配置的实现就是spring启动的时候,加载spring.factories的配置,解析每一个Configuration类,根据condition加载自动配置类,

    根据condition条件实例化bean对象,然后维护到spring容器中。

  • 相关阅读:
    GitHub设置添加SSH
    Django之Cookie、Session、CSRF、Admin
    Django之强大的Form功能
    Django之Model
    前端:DOM
    前端:JavaScript
    前端:CSS的知识点拾遗
    前端:CSS
    前端:HTML
    Python:线程、进程和协程
  • 原文地址:https://www.cnblogs.com/warrior4236/p/13281331.html
Copyright © 2011-2022 走看看