日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Springboot默认加载application.yml原理

發布時間:2023/12/10 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Springboot默认加载application.yml原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Springboot默認加載application.yml原理以及擴展

SpringApplication.run(…)默認會加載classpath下的application.yml或application.properties配置文件。公司要求搭建的框架默認加載一套默認的配置文件demo.properties,讓開發人員實現“零”配置開發,但是前提如果開發人員在application.yml或application.properties文件中自定義配置,則會“覆蓋”默認的demo.properties文件,按照Springboot外部化配置的特性(優先使用先加載的),只要demo.properties配置在application.yml或application.properties 配置之后加載到environment中即可。

一、SpirngApplication.run(…)源碼分析

通過源碼分析,得知Springboot加載配置文件,是利用Spring的事件機制,通過EventPublishingRunListener取發布準備資源事件ApplicationEnvironmentPreparedEvent,被ConfigFileApplicationListener監聽到,從而來實現資源的加載

具體源碼如下:

public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch = new StopWatch();stopWatch.start();ConfigurableApplicationContext context = null;Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();configureHeadlessProperty();//這里是擴展的關鍵點SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();try {ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);//這里是加載資源的關鍵ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);....} //從方法名稱來看就是準備environment的即配置信息 private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments) {// Create and configure the environmentConfigurableEnvironment environment = getOrCreateEnvironment();configureEnvironment(environment, applicationArguments.getSourceArgs());//這里默認EventPublishingRunListener發布ApplicationEnvironmentPreparedEvent事件//讓監聽器ConfigFileApplicationListener加載配置文件//這個listeners就是我們擴展的地方listeners.environmentPrepared(environment);bindToSpringApplication(environment);if (this.webApplicationType == WebApplicationType.NONE) {environment = new EnvironmentConverter(getClassLoader()).convertToStandardEnvironmentIfNecessary(environment);}ConfigurationPropertySources.attach(environment);return environment;} SpirngApplication.run(...)方法中有個重要的擴展點方法getRunListeners(args);private SpringApplicationRunListeners getRunListeners(String[] args) {Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class };return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args));}//可擴展的關鍵點SpringFactoriesLoader//SpringFactoriesLoader會去加載META-INF/spring.factories文件,并根據//type過濾出符合要求的類//比如這里的type對應的是:SpringApplicationRunListenerprivate <T> Collection<T> getSpringFactoriesInstances(Class<T> type,Class<?>[] parameterTypes, Object... args) {ClassLoader classLoader = Thread.currentThread().getContextClassLoader();// Use names and ensure unique to protect against duplicatesSet<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));List<T> instances = createSpringFactoriesInstances(type, parameterTypes,classLoader, args, names);AnnotationAwareOrderComparator.sort(instances);return instances;}

Springboot默認提供的META-INF/spring.factories,這里就是我們可以擴展的地方

Run Listeners

org.springframework.boot.SpringApplicationRunListener=\ org.springframework.boot.context.event.EventPublishingRunListener

至此資源加載的大概流程就分析完了,下面是我們的擴展

二、擴展——自定義加載配置文件(demo.properties)

通過上述源碼分析得知:只需要在項目中添加META-INF/spring.factories,并配置SpringApplicationRunListener為我們自定義的來即可

1、在項目中的resources下創建META-INF/spring.factories

org.springframework.boot.SpringApplicationRunListener=\ com.demo.module.ApplicatonEnvironDemoListener

2、ApplicatonEnvironDemoListener的代碼

package com.chyjr.hyboot.demo.module;import org.springframework.boot.SpringApplication;import org.springframework.boot.SpringApplicationRunListener;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.core.PriorityOrdered;import org.springframework.core.env.ConfigurableEnvironment;import org.springframework.core.env.MutablePropertySources;import org.springframework.core.env.PropertiesPropertySource;import org.springframework.core.env.PropertySource;import java.io.IOException;import java.util.Properties;public class ApplicatonEnvironDemoListener implements SpringApplicationRunListener,PriorityOrdered {private SpringApplication application;private String[] args;/*** 通過反射創建該實例對象的,構造方法中的參數要加上如下參數*/public ApplicatonEnvironDemoListener(SpringApplication application,String[] args){this.application = application;this.args = args;}/*** 在準備環境之間調用* SpringApplication#run -> listeners.starting();*/@Overridepublic void starting() {System.out.println("starting-----");}@Overridepublic void environmentPrepared(ConfigurableEnvironment environment) {Properties properties = new Properties();try {//demo.properties就是我們自定義的配置文件,extension是自定義目錄properties.load(this.getClass().getClassLoader().getResourceAsStream("extension/demo.properties"));PropertySource propertySource =new PropertiesPropertySource("demo",properties);//PropertySource是資源加載的核心MutablePropertySources propertySources = environment.getPropertySources();//這里添加最后propertySources.addLast(propertySource);} catch (IOException e) {e.printStackTrace();}}//省略其他方法.../*** 這里可以設置該配置文件加載的順序,在application.yml之前還是之后* EventPublishingRunListener#getOrder方法返回 “0”,按照需求這里我們這是比0大,* 即在application.yml之后加載,這樣在application.yml配置時,可以“覆蓋”my.yml* 這里用“覆蓋”可能不合適,意思到了就好*/@Overridepublic int getOrder() {return 1;}}

總結

以上是生活随笔為你收集整理的Springboot默认加载application.yml原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩黄色短片 | 国产尤物精品 | 国产精品白浆一区二小说 | 久久精品欧美视频 | 天堂最新 | 免费黄色小视频网站 | 中文字幕18页 | 黄色免费在线播放 | 影音先锋婷婷 | 精品人妻无码一区二区色欲产成人 | 国内偷拍一区二区 | 国产亚洲成人精品 | 国产精品白丝喷水在线观看 | 在线一区二区三区视频 | 亚洲韩国精品 | 蜜桃视频一区二区 | 婷婷另类小说 | 奇米影视第四色888 免费观看a毛片 | 拔插拔插海外华人永久免费 | 欧美极品喷水 | 亚洲熟女乱色综合亚洲av | 亚洲欧美日韩高清 | 国产日韩久久久 | 欧美少妇在线 | 激情六月婷 | 秋霞电影网一区二区 | 91麻豆产精品久久久久久 | 国产制服丝袜在线 | 精品午夜福利视频 | 国产天天射| 亚洲无码国产精品 | 男人桶女人桶爽30分钟 | 在线观看中文字幕一区二区 | 一区二区三区国产在线观看 | 亚洲美女性生活 | 野外吮她的花蒂高h在线观看 | 天堂中文字幕免费一区 | 国产亚洲AV无码成人网站在线 | 日本性猛交 | 牛牛热在线视频 | 播放一级黄色片 | 亚洲爱爱视频 | 噜噜色图| 日韩欧美在线免费 | 九九热精品视频在线观看 | 免费视频网站在线观看入口 | 欧美激情网 | 国产3p露脸普通话对白 | 美女免费黄视频 | 午夜精产品一区二区在线观看的 | 黄色片大全 | 91av国产精品| 日本美女毛片 | 男生操女生屁股 | 国语对白真实视频播放 | 亚洲视频一区在线播放 | 欧美精品一级在线观看 | 欧美精品18videosex性欧美 | 一本色道久久hezyo无码 | 香蕉视频911 | www.黄色免费 | 一区二区三区国产av | av中文字幕免费 | 97国产精东麻豆人妻电影 | 亚洲性事| 亚洲欧洲自拍偷拍 | 久久人久久| 精品视频一二三 | 国产黄色片在线免费观看 | 啦啦啦免费高清视频在线观看 | 久久精品五月天 | 综合久久一区二区 | 日本精品一区视频 | av免费看网站 | 麻豆久久久9性大片 | 国产激情综合 | 久久艹在线视频 | 亚洲AV无码精品自拍 | 男生把女生困困的视频 | 亚洲妇女av| 亚洲男人的天堂av | 四虎网址在线观看 | 免费成人毛片 | 国产精品久久久久精 | 手机成人在线 | 日韩视频免费观看高清完整版在线观看 | 鲁啊鲁在线视频 | 欧美成人免费 | 欧美性欧美zzzzzzzzz | 日批在线观看 | 日本中文字幕不卡 | 秋霞午夜影院 | 在线观看国产精品入口男同 | 精品国产乱子伦一区二区 | 一个色在线视频 | av在线播放网 | 欧美性大战xxxxx久久久 | 亚洲国产精品麻豆 | eeuss日韩 |