外部化配置
大多数情况下,我们会将整个应用程序配置在一个配置文件中,但是,你会发现,修改变得麻烦,也容易暴露敏感信息.这时候,可以将一部分配置抽取到配置文件中管理会很方便.
Spring自带了几个选项,可以借助它们将Spring配置细节信息外部化到属性文件中,这样就能在部署的应用之外进行管理:
- 属性占位符配置(
Property placeholder configurer
)会将占位符内的变量替换为外部属性文件的值. - 属性重写(
Property overrider
)会将Bean属性的值用外部属性文件的值进行重写.
替换属性占位符
例如:
对于db.properties文件,它将至少包含DriverManagerDataSource
所需要的属性:
现在,你可以将Spring配置中的硬编码替换为基于db.properties属性的占位符的变量:
属性占位符配置的作用不限于XMl中的Bean属性配置,你还可以用它来配置@Value
注解的属性,例如,如果有个Bean需要JDBC url,可以这样使用:
你甚至可以在属性文件自身中使用占位符变量:
替换缺失的属性
如果一个属性占位符变量引用了没有定义的属性,或者location指向的文件不存在,可以这么配置,使其在失败时不抛出异常,需要配置property-placeholder
的ignore-resource-not-found
和ignore-unresolvable
属性:
但是不抛出异常,占位符会是未解析的状态,这个时候也是无法正常使用的,所以有properties-ref
用来配置默认的装配属性值:
现在,如果有占位符变量无法在db.properties
中找到,那么将使用defaultConfiguration
Bean中的默认值 .
通过系统属性解析占位符变量
|
|
这里system-properties-mode
被设置为OVERRIDE
,这意味着<context:property-placeholder >
会优先使用系统属性.
除了OVERRIDE
,system-properties-mode
还有2个属性值:
- FALLBACK:如果不能从属性文件中解析占位符变量,将使用系统属性.
- NEVER:从不使用系统属性来解析占位符变量.
- OVERRIDE:相对于配置文件,优先使用系统属性.