[SpringBoot-05]配置文件原理

1、配置文件的思考

  SpringBoot官方文档中存在大量的配置,我们根本没办法全部记住。打开官网的文档,可以看出有这么多的文档:
在这里插入图片描述

2、分析自动配置的原理

  回忆之前分析SpringBoot的自动配置原理,和一个spring.factories文件密切相关:
在这里插入图片描述
  打开其中一个EnableAutoConfiguration当中其中一个,比如HttpEncodingAutoConfiguration

2.1 @Configuration

在这里插入图片描述
  这个@Configuration说明这个类HttpEncodingAutoConfiguration是一个配置类,和以前spring的xml配置文件一样,可以给容器中添加组件。

2.2 @EnableConfigurationProperties({HttpProperties.class})

  注意它的这个注解:
在这里插入图片描述
  注解@EnableConfigurationProperties意思是启动括号里那个类的ConfigurationProperties功能,说明这个类HttpProperties肯定有个注解@ConfigurationProperties,我们进入这个类:
在这里插入图片描述
  注解@ConfigurationProperties我们在学习yaml配置文件的时候见过,在给一个实体类注入值的时候,先在配置文件写好实体类的属性键值对,然后在实体类用这个注解注上进行赋值:
在这里插入图片描述
  看到这里就明白了,也就是这些SpringBoot的配置类都可以在配置文件进行赋值,为了进行验证,我们先看类HttpProperties有哪些属性:
在这里插入图片描述
  上面的黄框说明配置文件的spring.http下可以对下面黄框里面的属性进行赋值。

2.3 @ConditionalOnWebApplication

  接着分析配置类HttpEncodingAutoConfiguration的下一个注解@ConditionalOnWebApplication
在这里插入图片描述
  @ConditionalOnWebApplication是spring的低层注解@Conditional({OnWebApplicationCondition.class}),根据不同条件判断,如果满足指定条件,整个配置类的配置就会生效。这里的意思是:如果当前的应用是web应用,那么这个注解修饰的配置类就会生效。

2.4 @ConditionalOnClass

  继续分析下一个注解:
在这里插入图片描述
  @ConditionalOnClass注解名字和上一个都差不多,都是判断条件用的,这里的意思是:判断当前项目有没有这个类CharacterEncodingFilter,这个类是SpringMVC中进行乱码解决的过滤器,如果有这个类,配置类才生效。

2.5 @ConditionalOnProperty

  接着分析下一个注解:
在这里插入图片描述
  看这个注解的名字就能猜出来了:判断配置文件中是否存在括号里的配置,即使配置文件中不配置spring.http.encoding.enabled = true,默认也是生效的。

2.6 分析类中的方法

在这里插入图片描述

2.7 小结

  一连串分析下来,我们可以得出一个结论:SpringBoot的自动配置类会根据当前不同的条件判断,来决定每个配置类是否生效!
  一旦这个配置类生效了,这个配置类就会给容器中添加各种组件;
  这些组件的属性(也就是值)是从对应的properties类中获取的,这些类的每一个属性又是和配置文件绑定的;
  所有在配置文件能配置的属性都是在xxxxProperties类中封装着的,比如上面例子的HttpProperties
  配置文件能配置什么就可以参照某个功能对应的这个属性类

//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(prefix = "spring.http") 
public class HttpProperties {
    // .....
}

  打开properties配置文件,看IDEA的提示:
在这里插入图片描述
  这就是自动装配原理!

3、如何使用配置文件

  1、SpringBoot启动会加载大量的自动配置类;
  2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
  3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了);
  4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
  xxxxAutoConfigurartion:自动配置类;给容器中添加组件;
  xxxxProperties:封装配置文件中相关属性;
在这里插入图片描述

4、了解@Conditional

  了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效;我们也在这些自动配置里当中看到一堆@ConditionalOnXXX的注解。
  作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

@Conditional拓展注解作用(判断是否满足当前指定条件)
@ConditionalOnJava系统的Java版本是否符合要求
@ConditionalOnBean容器中是否存在指定的Bean
@ConditionalOnMissingBean容器中是否不存在指定Bean
@ConditionalOnExpression是否满足SpEL表达式指定值
@ConditionalOnClass系统中是否有指定的类
@ConditionalOnMissingClass系统中是否没有指定的类
@ConditionalOnSingleCandidate系统中是否只有一个指定的Bean,或这个Bean是否首选Bean
@ConditionalOnProperty系统中执行的属性是否有指定的值
@ConditionalOnResource类路径下是否存在指定资源文件
@ConditionalOnWebApplication当前是否web应用
@ConditionalOnNotWebApplication当前是否不是web应用
@ConditionalOnJndiJNDI是否存在指定项

  那么多的自动配置类,必须要一定条件下才能生效;换句话说,SpringBoot自动加载了这么多配置类,但也不是所有配置类都生效了。
  那我们如何知道哪些生效了,哪些没有生效呢?
  我们可以在application.yaml配置文件中加一句:

#开启springboot的调试类
debug: true

  运行应用,查看日志输出:
  Positive matches:(自动配置类启用的:正匹配)在这里插入图片描述
  Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
在这里插入图片描述
  Unconditional classes: (没有条件的类)在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值