13-Springboot中HttpEncodingAutoConfiguration自动配置详解

上一篇:12-Springboot自动配置原理&&源码解析https://blog.csdn.net/fsjwin/article/details/109739624

前面从方法论的高度对boot的自动配置做了介绍,但是还是有写问题没有解决,比如我们在yml中写什么呢?那么多的自动配置我们需要全部都学习一边吗?

答案是肯定:

  1. 从小楚入手,从HttpEncodingAutoConfiguration入手
  2. 掌握着一个套路就可以了。没有必要把100多个,或者后期有扩展的几千上万个自动配置都学习。
  3. 掌握了套楼之后,我们自己也可以写一个自动配置类,放在仓库中供他人使用、或者自己使用。
    下面开始一斑窥豹!

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环境
@ConditionalOnJndiJNDI存在指定项

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.总结

  1. 自动配置类负责条件bean到融入其中,以【*AutoConfiguration】结尾:
    例如:HttpEncodingAutoConfiguration
  2. 自动配置类对应一个封装yml的perperites类,以【*Properties】结尾:
    例如:ServerProperties
  3. yml文件按【*Properties】中规定的规则尽心配置就可以完美运行了。
    例如:
server:
  port: 9999

下一篇:14-Springboot默认数据源配置HikariDataSource https://blog.csdn.net/fsjwin/article/details/109741610

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值