咱们知道,在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
编写一个类继承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 其实就是用来定位咱们前面的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; } }
新建一个配置类,例如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 管理。这样不再怕在本地配置文件中出现敏感信息啦,不再怕修改配置文件须要登陆每个机器修改啦。