SpringBoot自动配置原理

SpringBoot自动配置原理

自动配置原理:

  1. SpringBoot启动的时候加载主配置类(项目名Application),
    开启了自动配置功能(@SpringBootApplication中的)@EnableAutoConfiguration
    在这里插入图片描述

  2. @EnableAutoConfiguration的作用:

  • 利用EnableAutoConfigurationImportSelector给容器中导入一些组件?
    在这里插入图片描述
  • 进入到AutoConfigurationImportSelector.class内部
    在这里插入图片描述
    通过 红框内的代码(如下),获取候选的配置
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
  • 进入**getCandidateConfigurations(annotationMetadata, attributes)**方法
    在这里插入图片描述
  • 进入loadFactoryNames ,后找到在这里插入图片描述
    因此**SpringFactoriesLoader.loadFactoryNames()**的作用是:扫描所有的jar包类路径下
    META-INF/spring.factories,把扫描到的这些文件的内容包装成properties对象,
    从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中。

即将类路径下 META-INF/spring.factories里面配置的所有EnableAutoConfiguration.class的值加入到了容器中。
在这里插入图片描述
每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置

  1. 每一个自动配置类进行自动配置功能;

  2. HttpEncodingAutoConfiguration为例解释自动配置原理

**HttpEncodingAutoConfiguration(Http编码自动配置)**类上注解

@Configuration(  // 表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
    proxyBeanMethods = false
)
@EnableConfigurationProperties({ServerProperties.class}) //启动ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;

@ConditionalOnWebApplication(  //Spring底层@Condition注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,则生效;如果不是,则不生效
    type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目有没有这个类
 // CharacterEncodingFilter: SpringMVC中进行乱码解决的过滤器;
@ConditionalOnProperty(  //判断配置文件中是否存在某个配置 server.servlet.encoding;如果不存在,判断也是成立的(即使我们配置文件中不配置server.servlet.encoding,也默认生效)
    prefix = "server.servlet.encoding",
    value = {"enabled"},
    matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {

根据当前不同的条件判断,决定这个配置类是否生效,一旦这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

  1. 所有在配置文件中能配置的属性都是在xxxx.properties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类
    ServerProperties.class
@ConfigurationProperties(  // 从配置文件中获取指定的值和bean的属性进行绑定
    prefix = "server",
    ignoreUnknownFields = true
)
public class ServerProperties {

附上雷丰阳(雷神的总结)
在这里插入图片描述
个人感觉,雷神版源码偏老,现在的源码经过更改完善,已经产生了一些变化。
因此对于springboot的思想学习,这仅仅只是一个开始。

一旦一种新技术开始滚动碾压道路,如果你不能成为压路机的一部分,那么你就只能成为道路的一部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值