SpringBoot自动配置原理

SpringBoot启动时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

@EnableAutoConfiguration

1. 使用AutoConfigurationImportSelector.class给容器导入一些组件
2. getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置
3. private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);这个方法会扫描所有jar包类路径下	META-INF/spring.factories,并把扫描的这些文件的内容包装成Properties对象,从properties中获取到EnableAutoConfiguration.class对应的值,然后把他们添加到容器中

总之一句话,就是将类路径下 META-INF/spring-factories里面配置的所有EnableAutoConfiguration的值加入到容器中
1
每一个这样的xxAutoConfuguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置
每一个自动配置类做自动配置功能

以HttpEncodingAutoConfiguration为例解释自动配置原理

@Configuration(proxyBeanMethods = false) // 表示这是一个配置类
@EnableConfigurationProperties(ServerProperties.class) // 启动指定类
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) // Spring底层的Conditional注解,根据不同的条件,如果满足条件,整个配置类里面的配置才会生效;这个注解说白了就是判断当前是不是web应用,如果是菜生效
@ConditionalOnClass(CharacterEncodingFilter.class) // 判断当前项目有没有这个类
// CharacterEncodingFilter: springMVC中进行乱码解决的拦截器
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)// 判断配置文件中是否存在某个配置 ,matchIfMissing 表示如果不存在也是成立的
// 说白了,就是说几十配置文件中不配置spring.http.encoding.enabled=true ,也是默认生效的
public class HttpEncodingAutoConfiguration {
    @Bean // 给容器中添加组件,这个组件某些值需要从propertis中获取
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
       CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
       filter.setEncoding(this.properties.getCharset().name());
       filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
       filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
       return filter;
}
}

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

所有配置文件中能配置的属性都是在xxxProperties;配置文件能配置什么就可以参照某个功能对应的这个属性

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) // 从配置文件中获取指定的值和bean的属性进行绑定
public class ServerProperties

精髓:

  1. springBoot启动会加载大量的自动配置类
  2. 我们看需要的功能有没有SpringBoot默认写好的自动配置类
  3. 我们再来看这个配置类中到期配置了哪些组件;
  4. 给容器自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中执行这些属性的值;
    xxxAutoConfiguration:自动配置类;给容器添加组件
    xxxProperties:自动配置属性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值