1. applicationContext.xml中指定配置文件。


<context:property-placeholder location="classpath:xxx.properties" ignore-unresolvable="true" />


当有多个配置文件时,上述配置可以配置多条。


<context:property-placeholder location="classpath:xxx.properties" ignore-unresolvable="true" /> <context:property-placeholder location="classpath:yyy.properties" ignore-unresolvable="true" />


2. Spring bean中使用@Value注解获取指定参数。


// xxx.properties配置项: // server.ip=192.168.1.1 // server.port=8080 @Value("${server.ip}") private String ip; @Value("${server.port}") private int port;


使用@Value注解的前提是当前对象的生命周期由Spring管理,是Spring bean,无论通过XML配置文件还是@Component、@Service等注解声明。假如一个对象的生命周期是我们程序自己管理的,比如常规用法下的new Object(),特别是做一些框架开发,经常用到Class.forName().newInstance()来实例化对象,那么想要反射为新创建对象的成员变量赋值时,如何借助Spring来获取已经解析好的properties属性值是个值得一试的探索。上述场景可以简化为:

如何在一个拥有Spring上下文的平台上,对不受Spring管理的对象使用依赖注入,达到类似@Value注解实现的功能。

思路也很简单,既然Spring已经解析过properties文件,那么通过某种手段把这些值暴露出来就可以了,EmbeddedValueResolverAware接口很适合做这件事情。Aware接口是定义一些能在Spring bean中操作Spring上下文信息的一类接口,常见的有ApplicationContextAware,可以在Spring bean中拿到ApplicationContext;BeanFactoryAware,可以在Spring bean中拿到Spring BeanFactory。这里的EmbeddedValueResolverAware也是类似功能,它定义了一个void setEmbeddedValueResolver(StringValueResolver resolver)接口方法,在bean初始化后,Spring回调setEmbeddedValueResolver()方法,将StringValueResolver对象注入到bean中,从这个对象中就能获取properties文件中的属性名称和值。用法如下:

1. 声明一个实现EmbeddedValueResolverAware接口的实例,用@Component注解声明为Spring bean,重写setEmbeddedValueResolver()方法,将StringValueResolver实例的引用保存下来,并且对外提供getPropertiesValue()方法,用于获取properties值。


@Component public class PropertiesUtils implements EmbeddedValueResolverAware { privat StringValueResolver stringValueResolver; @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { stringValueResolver = resolver; } public String getPropertiesValue(String name){ return stringValueResolver.resolveStringValue(name); } }


2. 通过${key}作为name格式调用getPropertiesValue()方法,获取properties值。


String name = "${server.ip}"; String value = http://ju.outofmemory.cn/entry/propertiesUtils.getPropertiesValue(name);


StringValueResolve解析出来的值都是String类型的,非String类型需要在拿到参数String值后自行转换。