spring boot加載自定義配置源

概述

咱們知道,在Spring boot中能夠經過xml或者@ImportResource 來引入本身的配置文件,可是這裏有個限制,必須是本地,並且格式只能是 properties(或者 yaml)。那麼,若是咱們有遠程配置,如何把他引入進來來呢。git

第一種方式

這外一種方法,相對更簡單些,可是相對沒那麼「優雅」。就是經過EnvironmentPostProcessor接口把咱們自定義的propertySource加入environment中,github

public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
       //這裏能夠自定義一個MyPropertySource,來保存配置信息
        MyPropertySource propertySource = new MyPropertySource("myPropertySource");
        environment.getPropertySources().addLast(propertySource);
    }
}

同時須要在META-INFO/spring.factories中加入spring

org.springframework.boot.env.EnvironmentPostProcessor=com.lizo.MyEnvironmentPostProcessor

第二種方式

第二種方式可能相對比較複雜一點,實際上是參考Sprng cloud中的作法,其實也只須要3步bootstrap

第一步,編寫PropertySource

編寫一個類繼承EnumerablePropertySource,而後實現它的抽象方法便可,抽象方法看名字就知道做用,簡單起見,這裏使用一個map來保存配置,例如:app

public class MyPropertySource extends EnumerablePropertySource<Map<String,String>> {
 
    public MyPropertySource(String name, Map source) {
        super(name, source);
    }
 
    //獲取全部的配置名字
    @Override
    public String[] getPropertyNames() {
        return source.keySet().toArray(new String[source.size()]);
    }
 
    //根據配置返回對應的屬性
    @Override
    public Object getProperty(String name) {
        return source.get(name);
    }
}

第二步,編寫PropertySourceLocator

PropertySourceLocator 其實就是用來定位咱們前面的PropertySource,須要重寫的方法只有一個,就是返回一個PropertySource對象,例如,ide

public class MyPropertySourceLocator implements PropertySourceLocator {
    @Override
    public PropertySource<?> locate(Environment environment) {
        //簡單起見,這裏直接建立一個map,你能夠在這裏寫從哪裏獲取配置信息。不管是本地仍是遠程
        Map<String,String> properties = new HashMap<>();
        properties.put("myName","lizo");
 
        MyPropertySource myPropertySource = new MyPropertySource("myPropertySource",properties);
        return myPropertySource;
    }
}

第三步,讓PropertySourceLocator生效

新建一個配置類,例如post

@Configuration
public class MyConfigBootstrapConfiguration {
 
    @Bean
    public MyPropertySourceLocator myPropertySourceLocator(){
        return new MyPropertySourceLocator();
    }
}

最後再建立/更新 META-INFO/spring.factories測試

org.springframework.cloud.bootstrap.BootstrapConfiguration=com.lizo.MyConfigBootstrapConfiguration

簡單來講就是給Spring Boot說,這個是一個啓動配置類(看名字一種優先級很高的配置類)。this

編寫測試

測試一

@SpringBootApplication
public class Test2 {
 
    public static void main(String[] args) throws SQLException {
        ConfigurableApplicationContext run = SpringApplication.run(Test2.class, args);
        Ser bean = run.getBean(Ser.class);
        System.out.println(bean.getMyName());
    }
 
    @Component
    public static class Ser{
        @Value("${myName}")
        private String myName;
 
        public String getMyName() {
            return myName;
        }
 
        public void setMyName(String myName) {
            this.myName = myName;
        }
    }
}

測試二

咱們在application配置文件中,引入這個變量呢,例如在application.properties中spa

my.name=${myName}

一樣,結果也是可以生效的

myName就是上面在PropertySourceLocator中寫進去的配置屬性。運行程序,能夠看見確實是能夠正確輸出。

小結

上面只是拋磚引玉,這樣不管是哪裏的數據源,均可以經過這種方式編寫,把配置交給Spring 管理。這樣不再怕在本地配置文件中出現敏感信息啦,不再怕修改配置文件須要登陸每個機器修改啦。

相關文章
相關標籤/搜索