我们都曾在项目中使用过.properties,比如多语言支持,参数配置等等,一般都是name=value的形式,然后系统的其它地方对其引用。
原始方式
举个例子,spring配置文件里配置一个数据源,这里只是举例,实际使用时推荐使用JNDI:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="initialSize" value="${jdbc.initialSize}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>
<property name="maxIdle" value="${jdbc.maxIdle}"/>
<property name="minIdle" value="${jdbc.minIdle}"/>
<property name="maxWait" value="${jdbc.maxWait}"/>
</bean>
<beanid="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
如果使用spring命名空间,可以使用如下方式:
<context:property-placeholder location="classpath:jdbc.properties" />
然后在jdbc.properties里这样配置:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.0.18:1521:dbserver
jdbc.username=testuser
jdbc.password=123456
jdbc.initialSize=0
jdbc.maxActive=8
jdbc.maxIdle=8
jdbc.maxWait=0
jdbc.minIdle=-1
这样,在spring在初始化dataSource时会读取jdbc.properties的内容进行相应的替换,部署程序或更换环境时修改这个properties就可以了。
改进方法
不过有些部署人员可能更喜欢去修改web.xml,比如部署时只需要修改数据库的SID,我们可以将这个参数像这样配置在web.xml中:
<context-param>
<param-name>dbserver.sid</param-name>
<param-value>dbserver</param-value>
</context-param>
然后在加入一个监听器:
<listener>
<listener-class>com.local.DBServerSIDListener</listener-class>
</listener>
监听器代码如下:
package com.local;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class DBServerSIDListener implements ServletContextListener {
public static final String DB_SERVER_SID= "dbserver.sid";
public void contextDestroyed(ServletContextEvent event) {
System.getProperties().remove(DB_SERVER_SID);
}
public void contextInitialized(ServletContextEvent event) {
ServletContext context = event.getServletContext();
String sid= context.getInitParameter(DB_SERVER_SID);
System.setProperty(DB_SERVER_SID, sid);
}
}
其实就是使用System.setProperty(DB_SERVER_SID, sid);在启动时将数据库的SID放到系统属性中,
此时修改jdbc.properties,如下:
jdbc.sid=${dbserver.sid}
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.0.18:1521:${jdbc.sid}
jdbc.username=testuser
jdbc.password=123456
jdbc.initialSize=0
jdbc.maxActive=8
jdbc.maxIdle=8
jdbc.maxWait=0
jdbc.minIdle=-1
这样就完成了配置。
为什么将参数放入系统属性spring也可以解释呢,原因就是,当spring读取配置时,如果在配置文件没有查找到,会去读取系统属性的。
其实这种方式可以应用到很多地方,大家可以举一反三。
需要注意的地方
不过使用系统属性时需要注意,系统属性是驻留在jvm里的,也就是说所有使用同一个jre(或者jdk)的东东都能够取到这个属性,如果两个应用中设置了相同属性key的属性,是会互相干扰,所以设置属性时一定要注意属性名不能相同。
如果大家不清楚jvm里都有哪些属性,可以用下面的方法查看:
for (Iterator i = System.getProperties().keySet().iterator(); i.hasNext();) {
String key = (String) i.next();
String val = System.getProperty(key);
System.out.println(String.format("%s=%s", key, val)+"<br>");
}