SpingBoot原理自动化配置原理解析

springBoot帮我们完成了什么事呢?、

  1. 帮我们完成引入相关的jar
    这里主要使用了pom的父项目,把常用的包都集成进来,由于是它帮我们完成了jar包的选择,就不会出现jar包冲突的问题。
  2. 帮我们完成自动配置
    2.1 自动配置的基础
    SpringBoot为了完成自动配置,需要完成什么样的处理了,该如何进行设计呢。
    问题 1 自动配置是为了完成什么
    是创建我们需要的Bean,把它添加到ioc容器
    问题 2 如果我们需要设计自动配置,该怎么做呢
    (1) 在一个jar包,我们需要一个类,来创建我们需要的bean
    这个bean主要负责创建bean
    (2) SpringBoot如何发现这个类
    需要提供一个机制,让springBoot来发现这个类,SpringBoot默认只扫描启动器同级的包,这些jar包是不会被springBoot发现的,这里可以仿照spring处理自定义标签的方式,在jar包下的META-INF 在指定一个默认的文件,里面存放jar包中负责创建bean类的类名,springBoot通过访问这个文件,就可以得到了负责创建bean的类,springBoot就发现了这个bean
    (3) 创建的bean如何存在先后关系,我们该怎么处理
    (4) 创建bean的能否提供参数配置呢
    我们通常会出现这样的问题,创建一个bean是需要依赖某个bean已经存在,所以我们还需要提供这样的机制来完成这种关系,这里可以使用注解来实现。
    从上面的问题,我们大概知道了,springBoot需要完成自动化配置,这些问题都必须来解决,带这这些问题,我们开始进入源码的实现过程。
    2.2 springBoot 源码实现原理
    2.2.1 @SpringBootApplication 解读
    在这里插入图片描述
    2.2.1.1 ComponentScan 标签解析
    这个标签的意思就是自动扫描bean,若指定了包路径,则去指定的包下扫描,如果没有指定,就会扫描当前类的的包和子包下的bean。源码如下。
    在这里插入图片描述
    从这里我们可以得到结论,springBoot默认是扫描类当前的包和子包下的bean
    2.2.1.2 SpringBootConfiguration 标签解析
    这个标签表示是配置类,可以搭配@Bean生成bean
    2.2.1.3 EnableAutoConfiguration
    从名字,我们就可以看出这个是自动配置类,那它是如何实现自动配置
    AutoConfigurationPackage配置程序包名称
    @Import(AutoConfigurationImportSelector.class)这个注解开始实现了自动配置了,
    来看这个类的实现

在这里插入图片描述
DeferredImportSelector这个接口代表进行导入类选择 ,并且在当前包导入完成后来帮助我们在自动话配置,这样设计是为了让我们的配置能够先生效。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这块的代码,获取到所有三方组件的自动化配置类
在这里插入图片描述
这里的类我们从我们的问题上可以看出,这些类应该是替我们自动创建bean的类,那它是怎么发现这些类的呢,
在这里插入图片描述
从这个方法上看,它是获取jar文件的指定的路径下的文件的内容。
在这里插入图片描述
可以发现,上面的那些配置类是在这个文件下进行配置,到这里我们就已经完成springBoot提供了自动创建bean的类,并且提供了发现了这些类的机制,接下来我们来解析,这些类是如何帮我们完成自动化创建bean,我们来提供一个mybait的自动化配置类来进行解析
2.2.2 自动化创建配置bean是如何工作的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.2.2.1 标签解析
在我们提出的问题上,我们知道创建bean存在这先后的问题,
ConditionalOnClass表示必须存在某些类,才能执行创建
AutoConfigureAfter 类加载完后,在加载指定的类
EnableConfigurationProperties 指定一个用户配置的属性配置类,这里存放这我们的常用配置属性,如果以后找不到配置类,我们可以从这里查找配置。
2.2.2.2 创建bean
从上面的标签,我们开始进入创建bean
在这里插入图片描述 这里就替我们完成了一个SqlSessionFactory的配置,而我们不需要自己来配置,到这里我们就对springBoot如何帮我们自动配置有了一个了解