PropertyPlaceholderConfigurer类就是bean factory post-processor的一种,它的作用是一个资源属性的配置器,能够将BeanFactory的里定义的内容放在一个以.propertis后缀的文件中。因此我们可以继承该类,实现自己定制的properties文件管理。
1、数据库的配置文件jdbc.properties存放数据库账号,密码及地址信息。这些数据直接暴露在外。所以需要对这些数据进行加密,但是使用加密后的数据直接去链接jdbc驱动账号密码不一致。此时我们可以定制该方法在读取的时候将密码解密.
2、初始化的时候。可以指定多个properties文件加载,其中可以包含静态配置文件。例如:短信模板,提示模板等资源数据。都可以进行托管
spring中配置
<bean id="springPropertiesUtil" class="cn.unitedtech.util.SpringPropertiesUtil">
<property name="locations">
<list>
<value>classpath:mysql.properties</value>
<value>classpath:shiro.properties</value>
<value>classpath:config.properties</value>
</list>
</property>
<property name="fileEncoding" value="UTF-8" />
</bean>
代码管理
private static Map<String, String> propertiesMap;
private final Log log = LogFactory.getLog(getClass());
private int springSystemPropertiesMode = SYSTEM_PROPERTIES_MODE_FALLBACK;
private final String userNameKey = "jdbc.userName";
private final String passWordKey = "jdbc.passWord";
@Override
public void setSystemPropertiesMode(int systemPropertiesMode) {
super.setSystemPropertiesMode(systemPropertiesMode);
springSystemPropertiesMode = systemPropertiesMode;
}
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props) throws BeansException {
String userName = props.getProperty(userNameKey);
String password = props.getProperty(passWordKey);
try {
if (StringUtils.isNotEmpty(userName)) {
props.setProperty(userNameKey, DESUtil.decrypt(userName));
}
if (StringUtils.isNotEmpty(password)) {
props.setProperty(passWordKey, DESUtil.decrypt(password));
}
} catch (Exception e) {
log.error("decrypt password exception", e);
}
propertiesMap = new HashMap<String, String>();
for (Object key : props.keySet()) {
String keyStr = key.toString();
if( null != keyStr && -1 >= keyStr.indexOf("jdbc") ){
String valueStr = resolvePlaceholder(keyStr, props, springSystemPropertiesMode);
propertiesMap.put(keyStr, valueStr);
}
}
super.processProperties(beanFactory, props);
}
public static String getProperty(String name) {
return propertiesMap.get(name).toString();
}
其中 propertiesMap 存放了非jdbc文件的数据。通过getProperty方法进行读取