FileEncodingApplicationListener使用以及原理

简介: 摘要:从本文开始我们会详细讲解springboot中一系列的事件监听器的使用以及内部实现原理,本文暂且讲解最简单的一个监听器,那就是文件编码监听器-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相关原创技术干货。 
扫一扫下方二维码或者长按识别二维码,即可关注。
 


相关文章
|
存储 Kubernetes 负载均衡
k8s是什么以及它的原理和如何去使用它?
k8s是什么以及它的原理和如何去使用它?
|
7月前
|
机器学习/深度学习 数据采集 人工智能
奥卡姆剃刀原理
奥卡姆剃刀原理“【5月更文挑战第17天】”
83 4
|
4月前
|
数据采集 自然语言处理 算法
Sekiro原理
这篇文章介绍了SEKIRO,一个多语言的、分布式的、与网络拓扑无关的服务发布平台,它支持通过编写不同语言的handler将功能发布到中心API市场,并通过RPC方式调用,特别适用于受限环境下的功能外放和服务提供。
66 0
|
7月前
|
编译器 C++ 容器
C++模板的原理及使用
C++模板的原理及使用
|
Kubernetes 监控 Cloud Native
k8s 自身原理 3
k8s 自身原理 3
|
存储 Kubernetes API
k8s 自身原理 1
k8s 自身原理 1
|
Kubernetes 监控 调度
k8s 自身原理 4
k8s 自身原理 4
|
监控 Dubbo 搜索推荐
ShutdownHook原理
有了ShutdownHook我们可以 在进程结束时做一些善后工作,例如释放占用的资源,保存程序状态等 为优雅(平滑)发布提供手段,在程序关闭前摘除流量
319 0
ShutdownHook原理