org.springframework.beans.factory.config.PropertyPlaceholderConfigurer

可以将上下文(配置文件)中的属性值放在另一个单独的标准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

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的相关文章

org.springframework.beans.factory.config.MethodInvokingFactoryBean的使用

它有两种用法:一个是调用类的静态方法,一个是调用已在IOC容器中的bean的方法.调用结果也分两种,一种是有返回,那么也会作为bean注册到IOC容器中,另一种是没有返回值,那么实际上就是为了在启动时进行方法调用而已.先看静态方法调用: <bean id="milletContext" class="cn.hello.millet.MilletContext" init-method="init"> <constructor-a

Exception in thread &quot;main&quot; java.lang.NoClassDefFoundError:org/springframework/beans/factory/config/EmbeddedValueResoler

我是在运行一个spring-mybatis小案例时遇到这个错误,已经解决,在这里记录和分享给你们 报错截图如下: 解决方法:检查发现spring的核心包spring-bean版本和其他核心包版本不同,更改为和其他核心包相同的版本即可 这类报错引起的原因还有一些,这只是一种解决方法供参考! 原文地址:https://www.cnblogs.com/quanbin/p/11100337.html

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException

1.错误描写叙述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help | start | stop } 2014-7-13 18:02:58 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.29 usi

org.springframework.beans.factory.BeanDefinitionStoreException

1.错误描写叙述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help | start | stop } 2014-7-12 11:48:27 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.29 usi

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named &#39;springSessionRepositoryFilter&#39; is defined

spring-session 集成redis,web.xml配置filter时候出现  No bean named 'springSessionRepositoryFilter' is defined 从spring给出的异常可以看出是没有取到这个bean,然后纠结了半天,各种版本切换找问题依旧未解决,然后Google找了半天, 也是没有找到问题解决方式,stackoverflow上也有许多人提出该问题,但是看了下面的解决方式,然并卵,一个都没用... 只能试着自己解决了. 既然没找到bean,

org.springframework.beans.factory.UnsatisfiedDepen

这个异常在网上找了好多办法,什么防火墙啊之类的,最后发现是启动顺序问题,先启动服务提供者,再启动消费者就好了,不然找不到服务就会报这个错误 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'managerItemCatServiceImpl': Unsatisfied dependency expressed through field 'itemCat

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException

1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help | start | stop } 2014-7-12 23:08:20 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.29 using

代理及注入之org.springframework.beans.factory.BeanNotOfRequiredTypeException (转载)

错误信息: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'aisleService' must be of type [com.gdie.whlocation.service.impl.AisleService], but was actually of type [$Proxy38] 这个问题出现的原因:一般在使用annotation的方式注入spring的bean 出现的,具体是由于

org.springframework.beans.factory.BeanCreationException: Error creating bean with name

这个问题在别人电脑上面没有出现,但我的电脑就出现了,在网上找各种解决方法:有的说是asm.jar冲突,有的说要配置byName,有的说是路径问题但路径明显是正确的. 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.B