Spring 使用 Properties
业务场景
应用在开发、测试、生产等阶段的资源往往是不同的,如:某个 API 接口的 URL,可能存在以下三个 URL:
- 开发环境:dev.api.xxx
- 测试环境:test.api.xxx
- 生产环境:proc.api.xxx
如果每次在部署应用时,手动修改配置,在企业工作中显然不可行。幸运的是,我们有很多工具可以实现自动地的为不同环境加载不同的配置,一种常见的方法是:将配置按环境分别放在不同的 properties 文件(dev.properties, test.properties, proc.properties 等)每次在不同环境部署时,使用 Maven 打包时,加上环境变量参数将对应的配置文件拷贝至classpath,最终通过 Spring 加载并使用classpath 中的配置。
本文主要讲解 Spring 如何使用 Properties,用于备忘。
注册 Properties
Spring 要能使用到 Properties,首先得将 Properties 进行注册,注册方式有两种:
- XML 方式
- Java Configuration 方式
通过 XML 注册
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:property-placeholder location="classpath:foo.properties" /> </beans>
|
上述 XML 配置指定使用 foo.properties,如果有多个 properties,可以多配置几个,也可以简单的将 foo.properties 改成 *.properties,按需选取即可。
老码农应该比较习惯使用 XML 的方式。
通过 Java Configuration注册
1 2 3 4 5
| @Configuration @PropertySource("classpath:foo.properties") public class PropertiesWithJavaConfig { }
|
上述效果与 XML 方式一致。
使用 Properties
通过 XML 或者 Java Configuration 完成Properties 注册后,即可在 Spring 中开始使用它们。使用方式有两种:
- 通过 @Value 注解使用
- 通过 XML 使用
通过 @Value 注解使用
1 2
| @Value( "${jdbc.url}" ) private String jdbcUrl;
|
通过 XML 使用
1 2 3
| <bean id="dataSource"> <property name="url" value="${jdbc.url}" /> </bean>
|
注:Properties 无论使用哪种方式注册,均可使用以上两个方式使用 Properties。
Properties 加载顺序
当有多个 Properties 文件,特别是不同的 Properties 文件内部存在相同的 properties 的 key 时,后加载的 properties 会覆盖掉先加载的 properties,所以理解并控制 Properties 加载顺序,才能避免踩坑。
Properties 加载顺序一般也有 2 种方式
- 按 properties 出现的先后顺序
- 显示使用 order 指定顺序
按 properties 出现的先后顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:property-placeholder location="classpath:foo.properties" /> <context:property-placeholder location="classpath:bar.properties" /> </beans>
|
这样的话,会先加载 foo.properties,再加载 bar.properties。
显示使用 order 指定顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:property-placeholder location="classpath:foo.properties" order="1" ignore-unresolvable="true"/> <context:property-placeholder location="classpath:bar.properties" order="2"/> </beans>
|
通过 order 属性可以显示指定加载顺序,需要注意的是除去最后一个加载的配置,其他均需添加 ignore-unresolvable=”true”,以防中间加载出现异常,导致后面的配置无法加载。