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相關原創技術干貨。?
掃一掃下方二維碼或者長按識別二維碼,即可關注。?
總結
以上是生活随笔為你收集整理的FileEncodingApplicationListener使用以及原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15.4. syslog, klogct
- 下一篇: git 本地分支与远程分支关联的一种方法