Spring提供了注解@Value,用于在程序中获取properties配置文件属性值。例如:
1. 中指定配置文件。
<context:property-placeholder location="classpath:" ignore-unresolvable="true" />
当有多个配置文件时,上述配置可以配置多条。
<context:property-placeholder location="classpath:" ignore-unresolvable="true" /> <context:property-placeholder location="classpath:" ignore-unresolvable="true" />
2. Spring bean中使用@Value注解获取指定参数。
// 配置项: // =192.168.1.1 // =8080 @Value("${}") private String ip; @Value("${}") private int port;
使用@Value注解的前提是当前对象的生命周期由Spring管理,是Spring bean,无论通过XML配置文件还是@Component、@Service等注解声明。假如一个对象的生命周期是我们程序自己管理的,比如常规用法下的new Object(),特别是做一些框架开发,经常用到().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 (name); } }
2. 通过${key}作为name格式调用getPropertiesValue()方法,获取properties值。
String name = "${}"; String value = /entry/(name);
StringValueResolve解析出来的值都是String类型的,非String类型需要在拿到参数String值后自行转换。
本文只对特定场景下使用EmbeddedValueResolverAware接口借助Spring上下文从properties文件中获取参数值做了一个简单介绍,此方法有效但不唯一,供参考。