FileEncodingApplicationListener使用以及原理

摘要:从本文开始我们会详细讲解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相关原创技术干货。 
扫一扫下方二维码或者长按识别二维码,即可关注。
 


猜你喜欢

转载自blog.csdn.net/qq_30739519/article/details/78842438