FileEncodingApplicationListener使用以及原理
摘要:從本文開始我們會(huì)詳細(xì)講解springboot中一系列的事件監(jiān)聽器的使用以及內(nèi)部實(shí)現(xiàn)原理,本文暫且講解最簡單的一個(gè)監(jiān)聽器,那就是文件編碼監(jiān)聽器-FileEncodingApplicationListener。
FileEncodingApplicationListener類相關(guān)源碼如下:
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是一個(gè)文件編碼監(jiān)聽器,它實(shí)現(xiàn)了Ordered接口,通過getOrder方法我們可以看出它的執(zhí)行優(yōu)先級(jí)是比較低的(getOrder方法的返回值越小,則執(zhí)行優(yōu)先級(jí)越高)。FileEncodingApplicationListener負(fù)責(zé)監(jiān)聽ApplicationEnvironmentPreparedEvent事件。ApplicationEnvironmentPreparedEvent:環(huán)境事先準(zhǔn)備,spring boot中的環(huán)境已經(jīng)準(zhǔn)備ok
可以通過ApplicationEnvironmentPreparedEvent獲取到SpringApplication、ConfigurableEnvironment等等信息, 可以通過ConfigurableEnvironment實(shí)例對象來修改以及獲取默認(rèn)的環(huán)境信息。
接下來我們重點(diǎn)梳理一下onApplicationEvent方法的處理邏輯。
1?通過event獲取環(huán)境ConfigurableEnvironment 。
2?通過環(huán)境來獲取spring.mandatory-file-encoding變量(所有的配置文件最終都被springboot解析存儲(chǔ)到環(huán)境中),如果不存在該變量,則直接返回。spring.mandatory-file-encoding變量默認(rèn)就沒有設(shè)置,因此我們?nèi)绻麤]有設(shè)置該變量的值,就不會(huì)執(zhí)行下文的邏輯。
3?獲取系統(tǒng)變量file.encoding。獲取spring.mandatory-file-encoding變量。
4?如果spring.mandatory-file-encoding的值(忽略大小寫)與file.encoding的值不相等,則直接報(bào)錯(cuò),直接不讓程序運(yùn)行。比如我們設(shè)置了spring.mandatory-file-encoding=utf-8,file.encoding的值為GBK則報(bào)錯(cuò);如果spring.mandatory-file-encoding=uTF-8,file.encoding的值為utf-8就不會(huì)報(bào)錯(cuò)。因?yàn)楸容^兩者值的時(shí)候已經(jīng)忽略大小寫了。
關(guān)于spring.mandatory-file-encoding屬性的配置步驟如下:
在項(xiàng)目的根目錄中創(chuàng)建application.properties文件,該文件的層級(jí)結(jié)構(gòu)如下圖所示:
?
application.properties文件的內(nèi)容如下:
spring.mandatory-file-encoding=GBK
至此,FileEncodingApplicationListener類的相關(guān)實(shí)現(xiàn)以及原理已經(jīng)講解完畢。
歡迎關(guān)注我的微信公眾號(hào),第一時(shí)間獲得博客更新提醒,以及更多成體系的Java相關(guān)原創(chuàng)技術(shù)干貨。?
掃一掃下方二維碼或者長按識(shí)別二維碼,即可關(guān)注。?
總結(jié)
以上是生活随笔為你收集整理的FileEncodingApplicationListener使用以及原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15.4. syslog, klogct
- 下一篇: git 本地分支与远程分支关联的一种方法