在springboot啓動的時候調用run方法,可以看到run方法裏面的內容,其中有一個getRunListeners方法
Ctrl+左鍵點進這個方法,發現getSpringFactoriesInstances方法,這個方法就是在所有jar包的spring.factories文件中尋找指定類型的值
我們去springboot包裏面的spring.factories文件搜索SpringApplicationRunListener
這個類的作用就是把application.yml配置文件中配置的內容加載在項目中,進入這個類可以看到它實現了SpringApplicationRunListener接口。
所以我們也可以創建一個類來實現這個接口,用來加載自己定義的配置文件。
創建一個my.properties,創建一個類MySpringApplicationRunListener類來實現SpringApplicationRunListener
實現裏面的方法,在environmentPrepared方法中書寫讀取配置文件的代碼
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
Properties properties = new Properties();
try {
//讀取my.properties配置文件
properties.load(this.getClass().getClassLoader().getResourceAsStream("my.properties"));
//讀取名稱爲my
PropertySource propertySource = new PropertiesPropertySource("my", properties);
//將資源添加到springboot項目中
MutablePropertySources propertySources = environment.getPropertySources();
propertySources.addLast(propertySource);
} catch (IOException e) {
e.printStackTrace();
}
}
然後在resources文件夾下創建一個META-INF文件夾,在裏面創建一個spring.factories文件,把springboot包中剛纔找到的那個配置copy過來,並且把下面的值改成自己的類路徑
我們來創建一個方法測試一下
在my.properties 文件中寫了一個鍵值對
myName=vhukze
在controller中獲取一下
@Value("${myName}")
private String myName;
@RequestMapping("/")
public String getMyName() {
return myName;
}
啓動項目報錯了
這個是報的一個反射異常,沒有找到有參構造
再來看一下springboot中的那個EventPublishingRunListener類
這個裏面是有一個這樣的有參構造的,那我們也在自己的類裏面添加一個
現在可以成功啓動項目了,訪問一下測試方法
如果想在application.yml配置文件之前加載,可以設置優先級,把我們的MySpringApplicationRunListener類再實現一個Ordered接口,實現裏面的getOrder方法,設置返回值小於0,因爲加載application配置文件的getOrder方法返回值是0;