spring boot自定义配置源操作步骤
概述
我们知道,在Springboot中可以通过xml或者@ImportResource来引入自己的配置文件,但是这里有个限制,必须是本地,而且格式只能是properties(或者yaml)。那么,如果我们有远程配置,如何把他引入进来来呢。
如何做
其实自定义配置源只需要3步
第一步,编写PropertySource
编写一个类继承EnumerablePropertySource,然后实现它的抽象方法即可,抽象方法看名字就知道作用,简单起见,这里使用一个map来保存配置,例如:
publicclassMyPropertySourceextendsEnumerablePropertySource
第二步,编写PropertySourceLocator
PropertySourceLocator其实就是用来定位我们前面的PropertySource,需要重写的方法只有一个,就是返回一个PropertySource对象,例如,
publicclassMyPropertySourceLocatorimplementsPropertySourceLocator{ @Override publicPropertySource>locate(Environmentenvironment){ //简单起见,这里直接创建一个map,你可以在这里写从哪里获取配置信息。 Mapproperties=newHashMap<>(); properties.put("myName","lizo"); MyPropertySourcemyPropertySource=newMyPropertySource("myPropertySource",properties); returnmyPropertySource; } }
第三步,让PropertySourceLocator生效
新建一个配置类,例如
@Configuration publicclassMyConfigBootstrapConfiguration{ @Bean publicMyPropertySourceLocatormyPropertySourceLocator(){ returnnewMyPropertySourceLocator(); } }
最后再创建/更新META-INFO/spring.factories(如果做过自定义Springboot开发的都知道这个文件)
org.springframework.cloud.bootstrap.BootstrapConfiguration=\ com.lizo.MyConfigBootstrapConfiguration
简单来说就是给SpringBoot说,这个是一个启动配置类(一种优先级很高的配置类)。
编写测试
测试一
@SpringBootApplication publicclassTest2{ publicstaticvoidmain(String[]args)throwsSQLException{ ConfigurableApplicationContextrun=SpringApplication.run(Test2.class,args); Serbean=run.getBean(Ser.class); System.out.println(bean.getMyName()); } @Component publicstaticclassSer{ @Value("${myName}") privateStringmyName; publicStringgetMyName(){ returnmyName; } publicvoidsetMyName(StringmyName){ this.myName=myName; } } }
正确输出
测试二
我们在application配置文件中,引入这个变量呢,例如在application.properties中
my.name=${myName}
同样,结果也是能够生效的
myName就是上面在PropertySourceLocator中写进去的配置属性。运行程序,可以看见确实是可以正确输出。
小结
上面只是抛砖引玉,这样无论是哪里的数据源,都可以通过这种方式编写,把配置交给Spring管理。这样再也不怕在本地配置文件中出现敏感信息啦,再也不怕修改配置文件需要登录每一个机器修改啦。