摘要:从本文开始我们会详细讲解springboot中一系列的事件监听器的使用以及内部实现原理,本文暂且讲解最简单的一个监听器,那就是文件编码监听器-FileEncodingApplicationListener。
FileEncodingApplicationListener类相关源码如下:
public class FileEncodingApplicationListener
implements ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered {
private static final Log logger = LogFactory.getLog(FileEncodingApplicationListener.class);
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
ConfigurableEnvironment environment = event.getEnvironment();
if (!environment.containsProperty("spring.mandatory-file-encoding")) {
return;
}
String encoding = System.getProperty("file.encoding");
String desired = environment.getProperty("spring.mandatory-file-encoding");
if (encoding != null && !desired.equalsIgnoreCase(encoding)) {
...
}
}
}
FileEncodingApplicationListener是一个文件编码监听器,它实现了Ordered接口,通过getOrder方法我们可以看出它的执行优先级是比较低的(getOrder方法的返回值越小,则执行优先级越高)。FileEncodingApplicationListener负责监听ApplicationEnvironmentPreparedEvent事件。ApplicationEnvironmentPreparedEvent:环境事先准备,spring boot中的环境已经准备ok
可以通过ApplicationEnvironmentPreparedEvent获取到SpringApplication、ConfigurableEnvironment等等信息, 可以通过ConfigurableEnvironment实例对象来修改以及获取默认的环境信息。
接下来我们重点梳理一下onApplicationEvent方法的处理逻辑。
1ã通过event获取环境ConfigurableEnvironment 。
2ã通过环境来获取spring.mandatory-file-encoding变量(所有的配置文件最终都被springboot解析存储到环境中),如果不存在该变量,则直接返回。spring.mandatory-file-encoding变量默认就没有设置,因此我们如果没有设置该变量的值,就不会执行下文的逻辑。
3ã获取系统变量file.encoding。获取spring.mandatory-file-encoding变量。
4ã如果spring.mandatory-file-encoding的值(忽略大小写)与file.encoding的值不相等,则直接报错,直接不让程序运行。比如我们设置了spring.mandatory-file-encoding=utf-8,file.encoding的值为GBK则报错;如果spring.mandatory-file-encoding=uTF-8,file.encoding的值为utf-8就不会报错。因为比较两者值的时候已经忽略大小写了。
关于spring.mandatory-file-encoding属性的配置步骤如下:
在项目的根目录中创建application.properties文件,该文件的层级结构如下图所示:
application.properties文件的内容如下:
spring.mandatory-file-encoding=GBK
至此,FileEncodingApplicationListener类的相关实现以及原理已经讲解完毕。
欢迎关注我的微信公众号,第一时间获得博客更新提醒,以及更多成体系的Java相关原创技术干货。
扫一扫下方二维码或者长按识别二维码,即可关注。