上一篇:12-Springboot自动配置原理&&源码解析https://blog.csdn.net/fsjwin/article/details/109739624
前面从方法论的高度对boot的自动配置做了介绍,但是还是有写问题没有解决,比如我们在yml中写什么呢?那么多的自动配置我们需要全部都学习一边吗?
答案是肯定:
- 从小楚入手,从HttpEncodingAutoConfiguration入手
- 掌握着一个套路就可以了。没有必要把100多个,或者后期有扩展的几千上万个自动配置都学习。
- 掌握了套楼之后,我们自己也可以写一个自动配置类,放在仓库中供他人使用、或者自己使用。
下面开始一斑窥豹!
1. HttpEncodingAutoConfiguration
下面对这个类进行解读:
//@Configuration表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@Configuration(proxyBeanMethods = false)
//@EnableConfigurationProperties(ServerProperties.class)启动指定类的ServerProperties功能;将配置文件中对应的值和ServerProperties绑定起来;并把ServerProperties加入到ioc容器中
@EnableConfigurationProperties(ServerProperties.class)
//当前应用为web应用的时候才会加载进容器中,怎么判断是不是web应用呢?还记得上篇设置Type=SERVLET吗?这个就可以确定是否是web应用。
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
//判断当前项目有没有这个类
@ConditionalOnClass(CharacterEncodingFilter.class)
//CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
//server.servlet.encoding默认就为enabled
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
//这个类封装与yml文件意义对应的数据。
private final Encoding properties;
/*
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties
结合
构造器的形参就可以进行注入。
当前的this.properties中已经含有了ServerProperties 了
*/
public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding();
}
/*
下面就可以对properties 进行使用了
*/
@Bean
@ConditionalOnMissingBean //条件判断:当ioc容器中没有当前bean时才会加载进容器中。
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;
}
- 条件判断@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;
注解 | 解释 |
---|---|
@Conditional扩展注解 | 作用(判断是否满足当前指定条件) |
@ConditionalOnJava | 系统的java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定Bean |
@ConditionalOnMissingBean | 容器中不存在指定Bean |
@ConditionalOnExpression | @ConditionalOnExpression |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选Bean |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication | 当前是web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | JNDI存在指定项 |
2. @EnableConfigurationProperties(ServerProperties.class) 中ServerProperties.class
@EnableConfigurationProperties(ServerProperties.class) 中ServerProperties.class就是封装yml的类
读取配置文件中的server打头的配置,进行封装,具体原理前面的YmlProerites例子中有解析。
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
/**
* Server HTTP port.
*/
private Integer port;
/**
* Network address to which the server should bind.
*/
private InetAddress address;
这样整个流程就能全部串起来了。
3.总结
- 自动配置类负责条件bean到融入其中,以
【*AutoConfiguration】
结尾:
例如:HttpEncodingAutoConfiguration - 自动配置类对应一个封装yml的perperites类,以
【*Properties】
结尾:
例如:ServerProperties - yml文件按
【*Properties】
中规定的规则尽心配置就可以完美运行了。
例如:
server:
port: 9999
下一篇:14-Springboot默认数据源配置HikariDataSource https://blog.csdn.net/fsjwin/article/details/109741610