你的位置:首页 > Java教程

[Java教程]org.springframework.beans.factory.config.PropertyPlaceholderConfigurer


可以将上下文(配置文件)中的属性值放在另一个单独的标准java Properties文件中去。在

从上图中,我们看到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" ><property name="location"><span >	</span><value>WEB-INF/conf/xx.properties</value></property><property name="fileEncoding"><span >	</span><value>UTF-8</value></property></bean><!--当然也可以引入多个属性文件,如: --><bean id="propertyConfigurer" ><property name="locations"><span >	</span><list><span >		</span><value>/WEB-INF/mail.properties</value><span >		</span><value>classpath:conf/sqlmap/jdbc.properties</value><span >	</span></list></property></bean>
<bean id="econsoleDS" destroy-method="close"><property name="driverClass"><span >	</span><value>${jdbc.driverClassName}</value></property><property name="jdbcUrl"><span >	</span><value>${jdbc.url}</value></property><property name="user"><span >	</span><value>${jdbc.username}</value></property><property name="password"><span >	</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方法就可以。