javascript
对集合变量定义赋值_SpringBoot配置加载原理(自定义加载配置)
前言
在SpringBoot應用程序中會有很多的地方定義配置文件,如:
bootstrap.properties
application.properties
或者是SpringCloud中定義的遠程配置中心,在這些地方我們只需要定義好我們的配置屬性,然后在代碼中使用如下的兩個注解就可以使用了:
@Value(${server.port})--只能給一個屬性賦值
@ConfigurationProperties(prefix = "spring.datasource.druid")--可以將此前綴的屬性自動賦值給一個bean的屬性。
下面講下配置加載的原理,知道原理后,我們就可以將任何遠程的配置或者是自定義的配置加載到應用程式中,然后就可以只用@Value和@ConfigurationProperties注解使用。
原理
先看一下SpringBoot中關于屬性的幾個重要的類:
ConfigurableEnvironment--接口1.定義了可以添加和設置活躍的profile文件(默認只有一個,可以調用此方法設置幾個活躍的配置文件)。2.獲取環境變量。--操作系統的變量3.獲取系統變量。--java層面的啟動變量4.MutablePropertySources getPropertySources()這個方法重點關注,后面會用到,能獲取到所有配置信息。5.MutablePropertySources這個類里面有個list集合,用于存放所有的配置。6.只要將配置信息加入到MutablePropertySources的list集合中,我們就可以使用了(重點,重點,重點)。ConfigurableEnvironment接口
來一張圖直觀一些,就是加載各種配置
MutablePropertySources1.有一個list屬性private final List> propertySourceList = new CopyOnWriteArrayList<>();2.PropertySource就是具體的配置,我們的任務就是把我們的配置信息構造成PropertySource對象,然后加入到這個list當中去。PropertySource1.有兩個重要屬性protected final String name;--配置定義的名稱protected final T source;--具體配置信息例子
如果要實現動態的將配置信息添加到應用程序中,我們需要定義一個EnvironmentPostProcessor的實現類。Talk is cheap,show me the code...
@Slf4j public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor { PropertiesPropertySourceLoader load=new PropertiesPropertySourceLoader(); //可以將.properties的配置文件加載進來 @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { MutablePropertySources propertySources =environment.getPropertySources(); //獲取到MutablePropertySources對象 Resource resource=new ClassPathResource("custom.properties"); //自定義的配置文件,具體位置如下圖 try { PropertySource propertySource=load.load("customProperties",resource).get(0); //生成PropertySource對象 propertySources.addFirst(propertySource); //將我們的PropertySource對象加入到集合中 } catch (IOException e) { e.printStackTrace(); } }}記得要在META-INF下的spring.factories(沒有手動創建)文件添加EnvironmentPostProcessor實現類的定義
這樣服務啟動之后,在custom.properties定義的任何配置信息,都可以使用@Value和@ConfigurationProperties注解使用。Spring Cloud的各種配置中心也是這個原理實現的,PropertySource這個頂層抽象定義了配置資源,我們只需要創建配置資源具體對象,然后加入到MutablePropertySources的集合屬性中即可。
后續再說明下如何加載各個位置的配置資源...
后續補充:
上面的例子中使用到了PropertiesPropertySourceLoader來加載配置文件,其實還有如下的類可以加載
PropertySourceLoader--接口
PropertiesPropertySourceLoader--實現類(例子中使用到的),加載.properties
YamlPropertySourceLoader--實現類,加載.yaml配置
它們的load()方法需要2個參數
load(String name, Resource resource)
name--我們可以隨意改名字
Resource--資源的實現類,有如下的可以使用
總結
以上是生活随笔為你收集整理的对集合变量定义赋值_SpringBoot配置加载原理(自定义加载配置)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把牙齿一次洗白要多少钱
- 下一篇: spring定时器突然不执行了_编程中常