【SpringBoot】6、自动配置原理【狂神篇
@Configuration
表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties
启动指定类的 ConfigurationProperties 功能
ServerProperties.class
@ConfigurationProperties(
prefix = "server",
ignoreUnknownFields = true
)
public class ServerProperties {
// ...
private final ServerProperties.Servlet servlet;
// ...
// 内部静态类
public static class Servlet {
//
private final Encoding encoding = new Encoding();
public Encoding getEncoding() {
return this.encoding;
}
}
}
@ConditionalOnXxx
根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效
@ConditionalOnWebApplication(type = Type.SERVLET)
判断当前应用是否是 web 应用,如果是,当前配置类生效
@ConditionalOnClass({CharacterEncodingFilter.class})
判断当前项目有没有这个类 CharacterEncodingFilter;
SpringMVC 中解决乱码的过滤器;
@ConditionalOnProperty( prefix = "server.servlet.encoding", value = {"enabled"}, matchIfMissing = true )
判断配置文件中是否存在某个配置:server.servlet.encoding
matchIfMissing = true
如果不存在,判断也是成立的;即使配置文件中不配置 server.servlet.encoding = true,也是默认生效的;
总结:根据当前不同的条件判断,决定这个配置类是否生效!
一但这个配置类生效;就会给容器中添加各种组件;
这些组件的属性是从对应的
properties类
中获取的,这些类里面的每一个属性又是和配置文件绑定的;所有在配置文件中能配置的属性都是在
XxxProperties类
中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类
[](()2、精髓
==============================================================
1、SpringBoot 启动会加载大量的自动配置类
2、看我们需要的功能有没有在 SpringBoot 默认写好的自动配置类当中;
3、再来看这个自动配置类中到底配置了哪些组件;(如果要用的组件在其中,就不需要再手动配置了)
4、给容器中自动配置类添加组件的时候,会从 properties 类中获取某些属性。只需要在配置文件中指定这些属性的值即可;
XxxAutoConfigurartion
自动配置类,给容器中添加组件
XxxProperties
封装配置文件中相关属性
[](()3、@Conditional
========================================================================
自动配置类必须在一定的条件下才能生效
@Conditional 派生注解(Spring 注解版原生的 @Conditional 作用)
作用:必须是 @Conditional 指定的条件成立,才给容器中添加组件,配置类里面的所有内容才生效;
| @Conditional 扩展注解 | 作用(判断是否满足当前指定条件) |
| --- | --- |
| @ConditionalOnJava | 系统的 java 版本是否符合要求 |
| @ConditionalOnBean | 容器中存在指定 Bean |
| @ConditionalOnMissingBean | 容器中不存在指定 Bean |
| @ConditionalOnExpression | 满足 SpEL 表达式指定 |
| @ConditionalOnClass | 系统中有指定 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 的类 |
评论