SpringBoot使用spring.factories加載默認(rèn)配置的實(shí)現(xiàn)代碼
在日常開發(fā)過程中,發(fā)布一些產(chǎn)品或者框架時(shí),會(huì)遇到某些功能需要一些配置才能正常運(yùn)行,這時(shí)我們需要的提供默認(rèn)配置項(xiàng),同時(shí)用戶也能覆蓋進(jìn)行個(gè)性化
創(chuàng)建Initializer
public class FrameContextInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("FrameContextInitializer--Start"); System.out.println("FrameContextInitializer--End"); } }
配置Initializer
resources/META-INF文件夾下創(chuàng)建spring.factories文件,指定實(shí)現(xiàn)類
org.springframework.context.ApplicationContextInitializer=com.haopan.frame.common.initializer.FrameContextInitializer
實(shí)現(xiàn)Initializer
讀取默認(rèn)yml文件
String frameYAMLFilePath = ClassPathFileUtil.getFilePathActual("systemfile/config/frame.yml"); public static String getFilePathActual(String classFilePath) { String filePath = ""; try { String templateFilePath = "tempfiles/classpathfile/"; File tempDir = new File(templateFilePath); if (!tempDir.exists()) { tempDir.mkdirs(); } String[] filePathList = classFilePath.split("/"); String checkFilePath = "tempfiles/classpathfile"; for (String item : filePathList) { checkFilePath += "/" + item; } File tempFile = new File(checkFilePath); if (tempFile.exists()) { tempFile.delete(); } //解析 ClassPathResource classPathResource = new ClassPathResource(classFilePath); InputStream inputStream = classPathResource.getInputStream(); checkFilePath = "tempfiles/classpathfile"; for (int i = 0; i < filePathList.length; i++) { checkFilePath += "/" + filePathList[i]; if (i == filePathList.length - 1) { //文件 File file = new File(checkFilePath); if(!file.exists()){ FileUtils.copyInputStreamToFile(inputStream, file); } } else { //目錄 tempDir = new File(checkFilePath); if (!tempDir.exists()) { tempDir.mkdirs(); } } } inputStream.close(); filePath = checkFilePath; } catch (Exception e) { e.printStackTrace(); } return filePath; }
將yml內(nèi)容加到環(huán)境上下文
這邊的addLast是執(zhí)行順序?yàn)樽詈笞x取,如果項(xiàng)目的yml文件沒有讀取到,則默認(rèn)配置是一個(gè)保底
System.out.println("FrameContextInitializer--Start"); PropertySource<?> propertySource = loader.load("frameConfiguration", new InputStreamResource(new FileInputStream(frameYAMLFilePath))).get(0); applicationContext.getEnvironment().getPropertySources().addLast(propertySource); System.out.println("FrameContextInitializer--End");
到此這篇關(guān)于SpringBoot使用spring.factories加載默認(rèn)配置的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)SpringBoot spring.factories加載配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Cloud?OAuth2實(shí)現(xiàn)自定義token返回格式
Spring?Security?OAuth的token返回格式都是默認(rèn)的,但是往往這個(gè)格式是不適配系統(tǒng)。本文將用一個(gè)接口優(yōu)雅的實(shí)現(xiàn)?Spring?Cloud?OAuth2?自定義token返回格式,需要的可以參考一下2022-06-06使用Cloud?Studio構(gòu)建SpringSecurity權(quán)限框架(騰訊云?Cloud?Studio?實(shí)戰(zhàn)訓(xùn)練
隨著云計(jì)算技術(shù)的成熟和普及,傳統(tǒng)編程能力和資源以云服務(wù)的形式開放出來,從中間件、數(shù)據(jù)庫等水平能力服務(wù)組件到人臉識別、鑒權(quán)服務(wù)等基本業(yè)務(wù)服務(wù)組件很容易的在云端獲取,本文介紹使用Cloud?Studio構(gòu)建SpringSecurity權(quán)限框架的相關(guān)知識,感興趣的朋友一起看看吧2023-08-08Spring中ApplicationEventPublisher發(fā)布訂閱模式的實(shí)現(xiàn)
本文主要介紹了Spring中ApplicationEventPublisher發(fā)布訂閱模式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Java讀取properties配置文件時(shí),出現(xiàn)中文亂碼的解決方法
下面小編就為大家?guī)硪黄狫ava讀取properties配置文件時(shí),出現(xiàn)中文亂碼的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11Spring Boot Cache使用方法整合代碼實(shí)例
這篇文章主要介紹了Spring Boot Cache使用方法整合代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02spring boot udp或者tcp接收數(shù)據(jù)的實(shí)例詳解
這篇文章主要介紹了spring boot udp或者tcp接收數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12nacos在liunx系統(tǒng)中啟動(dòng)成功瀏覽器卻訪問不了的解決方法
在linux下搭建nacos,現(xiàn)在想要啟動(dòng),訪問nacos頁面,訪問不了,所以本文小編將給大家介紹nacos在liunx系統(tǒng)中啟動(dòng)成功,瀏覽器卻訪問不了?全面的解決辦法,需要的朋友可以參考下2023-09-09