Spring Boot自定义配置属性源(自定义配置属性源(PropertySource))
主要介绍了Spring Boot自定义配置属性源(PropertySource),小编觉得挺不错的,现在分享给大家,也给大
家做个参考。一起跟随小编过来看看吧
配置覆盖优于配置覆盖优于profile
在生产实践中,配置覆盖是解决不同环境不同配置的常用方法。比如用生产服务器上的配置文件覆盖包内的文件,或者使用中
心化的配置服务来覆盖默认的业务配置。
相比于profile机制(比如maven的profile、spring boot的profile-specific properties),即不同环境使用不同的配置文件,覆盖
的方式更有优势。程序员在开发时不需要关心生产环境数据库的地址、账号等信息,一次构建即可在不同环境中运行,而
profile机制需要将生产环境的配置写到项目资源文件中,而且要为不同环境使用不同的构建参数或者运行参数。
Spring提供了灵活的配置扩展能力,有多种方式将自定义的属性源,将集成进来,可以轻松地实现配置覆盖。
本文基于Spring Boot 1.4.8/Spring 4.3.12编写
使用使用@PropertySource注解实现自定义配置文件和配置覆盖注解实现自定义配置文件和配置覆盖
@ConfigurationProperties
@Configuration
public class DemoProperties {
// properties with getter/setters
}
@PropertySource(value = {
"test.properties",
"file:/etc/test.properties",
},
ignoreResourceNotFound = true)
@Configuration
public class DemoAutoConfiguration {
@Autowired
private DemoProperties demoProperties;
@PostConstruct
public void init() {
System.out.println(demoProperties);
}
}
Spring支持使用PropertySource注解引入自定义配置文件,其中"test.properties"将使Spring从classpath下加载该文
件,"file:/etc/test.properties"将使Spring从文件系统加载/etc/test.properties文件,ignoreResourceNotFound = true使Spring忽
略文件加载失败的异常,即配置文件是可选的。
同时,由于"file:/etc/test.properties"位于"test.properties"之后,这使得文件系统的配置文件可以覆盖classpath下的配置。
自定义属性源工厂自定义属性源工厂
如果想要更加灵活的自定义属性源,比如实现从中心化的配置服务加载配置,可以通过实现PropertySourceFactory接口,并
通过配置PropertySource注解的factory参数来实现。
@Configuration
@PropertySource(value = ""/*placeholder*/,
factory = CompositePropertySourceFactory.class)
public class CompositeConfigAutoConfiguration {
}
value字段用于指定配置源对应的资源文件,如果不需要使用资源文件,可以配置为任意值,参数值将会被传递到factory参数
的createPropertySource方法。
如果ignoreResourceNotFound字段指定为true,那么factory抛出的异常将被忽略,否则将导致启动失败。有的时候,直接把
启动失败暴露出来不失为一种好的做法。
PropertySourceFactory接口的定义如下:
/**
* Strategy interface for creating resource-based {@link PropertySource} wrappers.
*
* @author Juergen Hoeller
* @since 4.3
* @see DefaultPropertySourceFactory