在进行项目开发中,我们需要维护一些常量,这些常量在不同的环境下面是不一样的,例如:数据库信息,在开发库、测试库和正式库中数据库URL地址和用户名/密码可能不一样,我们不能直接将这些信息写入到代码中,因为写入到代码中我们每次都需要修改代码,然后重新编译代码。这是麻烦的!!!再Spring中,可以使用properties文件进行维护,然后在代码中使用注解@Value进行引用,也可以在Spring的配置文件中使用${}进行引用。
但是,在进行引用之前,我们需要通过配置 PropertyPlaceholderConfigurer Bean或者使用<context:property-placeholder>标签进行配置。
实例:假如我们需要在项目中引入数据库,将数据库信息保存到jdbc.properties文件中,jdbc.properties内容如下:
#jdbc配置 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=root
PropertyPlaceholderConfigurer实现了BeanFactoryPostProcessor接口,它能够对<bean/>中的属性值进行外在化管理。开发者可以提供单独的属性文件来管理相关属性。
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean>
在 Spring 配置文件的 bean 中使用,如下代码:
<bean id="testDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean>
在 Java 代码中使用,代码如下:
@Service public class JdbcInfo { @Value("${jdbc.driverClassName}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; }
PropertyPlaceholderConfigurer内置的功能非常丰富,如果它未找到${xxx}中定义的xxx键,它还会去JVM系统属性(System.getProperty())和环境变量(System.getenv())中寻找。通过启用systemPropertiesMode和searchSystemEnvironment属性,开发者能够控制这一行为。
为简化PropertyPlaceholderConfigurer的使用,Spring提供了<context:property-placeholder/>元素。下面给出了配置示例,启用它后,开发者便不用配置PropertyPlaceholderConfigurer对象了。实例:
<context:property-placeholder location="classpath:jdbc.properties"/>
本文介绍了Spring中两种引用外部属性文件的方式,可以使应用程序可配置化。Spring提供了 PropertyPlaceholderConfigurer 和 <context:property-placeholder/> 两种方式,后者是前者的简化。