SpringBoot自动配置原理

SpringBoot自动配置原理

要了解SpringBoot自动配置原理,我们首先从一个SpringBoot主配置类入手
在这里插入图片描述
run方法中传入了一个被@SpringBootApplication注解的类,@SpringBootApplication标注在一个类上说明该类是一个SpringBoot项目的主配置类,也就是该项目的入口

我们点进@SpringBootApplication注解
在这里插入图片描述
发现@SpringBootConfiguration注解是一个组合注解,这里我们重点看@EnableAutoConfiguration注解(其他注解在笔者之前一篇关于SpringBoot运行原理的文章中有解释),因为正是这个注解,开启了自动配置功能

我们进入@EnableAutoConfiguration注解:
在这里插入图片描述
我们再进入@AutoConfigurationPackage注解,顾名思义,该注解是用于自动配置包,原理主要是使用的@Import来给Spring容器中导入一个组件,即导入了AutoConfigurationPackages包下的Registrar.class
在这里插入图片描述
然后我们再看Registrar.class:
在这里插入图片描述
正是通过该方法获取扫描包的路径

我们可以试验一下,我们在该方法处打一个断点,然后进行debug调试
在这里插入图片描述
进入主配置类debug调试,即进入了刚打的断点处:
在这里插入图片描述
然后使用 alt+f8 查看一下能否获得包的路径:
在这里插入图片描述
由结果可以得出,已经获得了包的路径

metadata是标注在SpringBoot项目的主配置类上的,即将主配置类(即@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描加载到Spring容器,因此我们在一个SpringBoot项目中创建我们自己的业务包或代码时,必须与主配置类同包或者在同包的子包下
在这里插入图片描述
到这里,已经获得了自动扫描包的路径,具体扫描了那些组件,就需要来看@Import(AutoConfigurationImportSelector.class)这个注解
在这里插入图片描述
通过@Import注解向Spring容器中导入一些组件,这里导入的是组件选择器AutoConfigurationImportSelector,我们点进去查看,找到selectImports方法,返回值是String类型的数组,该方法将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中:
在这里插入图片描述
但实际运行时这个方法调用的是该类的其他方法,我们再找到 getAutoConfigurationEntry 方法并debug调试:
在这里插入图片描述
通过该方法,获取到了很多需要的组件,并配置好了这些组件:
在这里插入图片描述
那这些配置类怎么获取到的呢,我们来看getCandidateConfigurations(获取候选配置)
在这里插入图片描述
我们继续进入loadFactoryNames方法,
在这里插入图片描述
发现它又调用了loadSpringFactories 方法,我们找到这个方法:
在这里插入图片描述
发现它获取了一个资源文件,即 META-INF/spring.factories
在这里插入图片描述
我们阅读loadSpringFactories 源码,发现它将读取到的资源封装在url中,然后遍历url , 将这些url文件封装在Properties文件中;最后返回封装好的结果

我们再回去看getCandidateConfigurations方法,该ClassLoader参数,我们追踪回去,看到他就是 EnableAutoConfiguration
在这里插入图片描述
在这里插入图片描述
说明了这个逻辑就是 从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中

总结一下就是:Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前我们需要自己配置的东西,自动配置类都帮我们完成了
在这里插入图片描述
每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,最后都加入到容器中;用他们来做自动配置,当一个SpringBoot项目启动时,会根据当前场景决定哪些配置生效,哪些配置不生效,这就是自动装配的原理

通过以上,可以得出SpringBoot框架的精髓所在:

  1. SpringBoot启动会加载大量的自动配置类

  2. 看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中

  3. 再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

  4. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

  5. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值