springboot自定義外部擴展文件

在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;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章