可以将上下文(配置文件)中的属性值放在另一个单独的标准java Properties文件中去。在XML文件中用${key}替换指定的properties文件中的值。这样的话,只需要对properties文件进行修改,而不用对xml配置文件进行修改。
从上图中,我们看到PropertyPlaceholderConfigurer实现了三个bean生命周期的接口:BeanFactoryAware & BeanNameAware & BeanFactoryPostProcessor。关于spring bean的生命周期,可以参考这里http://blog.csdn.net/gjb724332682/article/details/46767463。
PropertyResourceConfigurer.postProcessBeanFactory()将properties文件中的属性进行merge,convert,最后调用PropertyPlaceholderConfigurer.processProperties()完成遍历bean定义替换属性占位符。
例子:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <span style="white-space:pre"> </span><value>WEB-INF/conf/xx.properties</value> </property> <property name="fileEncoding"> <span style="white-space:pre"> </span><value>UTF-8</value> </property> </bean> <!--当然也可以引入多个属性文件,如: --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <span style="white-space:pre"> </span><list> <span style="white-space:pre"> </span><value>/WEB-INF/mail.properties</value> <span style="white-space:pre"> </span><value>classpath:conf/sqlmap/jdbc.properties</value> <span style="white-space:pre"> </span></list> </property> </bean>
<bean id="econsoleDS" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <span style="white-space:pre"> </span><value>${jdbc.driverClassName}</value> </property> <property name="jdbcUrl"> <span style="white-space:pre"> </span><value>${jdbc.url}</value> </property> <property name="user"> <span style="white-space:pre"> </span><value>${jdbc.username}</value> </property> <property name="password"> <span style="white-space:pre"> </span><value>${jdbc.password}</value> </property> </bean>
除此之外,我们还可以扩展自这个类,用来诸如加解密配置信息等操作。如下:
import java.util.Properties; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanInitializationException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; import com.xxx.util.AESUtils; public class DecryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer { private String key = "xxxxxx"; @Override protected void processProperties( ConfigurableListableBeanFactory beanFactory, Properties props) throws BeansException { try { String driverClassName = props.getProperty("driverClassName"); if (driverClassName != null) { props.setProperty("driverClassName", AESUtils.aesDecrypt(driverClassName, key)); } String url = props.getProperty("url"); if (url != null) { props.setProperty("url", AESUtils.aesDecrypt(url, key)); } String username = props.getProperty("username"); if (username != null) { props.setProperty("username", AESUtils.aesDecrypt(username, key)); } String password = props.getProperty("password"); if (password != null) { props.setProperty("password", AESUtils.aesDecrypt(password, key)); } super.processProperties(beanFactory, props); } catch (Exception e) { e.printStackTrace(); throw new BeanInitializationException(e.getMessage()); } } }
重写processProperties方法就可以。
时间: 2024-10-14 04:14:06