怪盗基德 2017-09-22
最近试着搭了一个spring+springmvc+mybatis+activiti的框架,遇到了不少问题。自己也学习了很多资料。在此记录下关于@Value使用过程中的一些问题。
关于spring中@Value的使用,我主要是用来便捷地引用属性文件的键值。使用方法,网上有很多相关文章,略做整理,大致用法如下:
1、在spring的配置文件中申明spring加载属性文件的bean。需要指明属性文件的具体位置:
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="locations"> <list> <value>classpath:resources.properties</value> </list> </property> </bean> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> <property name="properties" ref="configProperties" /> </bean>
这是我在网上看到的做法。
我使用的是另外一种,使用context标签,感觉更简洁,如下:
2、以上是通过spring来加载属性文件的声明,接下来是使用。通过@Value注解。似乎也有两种方式,第一种:
@Value("${document.location}") private String filePath;
document.location为.properties中的属性名。注解为变量filePath赋属性值,有个问题是,我并没有在此类中添加set方法。
还有一种方式如下:
@Value("#{configProperties['document.location']}") private String filePath;
configProperties为spring处理属性文件的bean的id。不知道这个说法对不对。
上面其实都不是我想说的东西。我想说的是我tm取值取不出来啊!!要么是null:在mvc的配置文件中有用“${}”来取值,取到的是${document.location}字符串。要么是在代码中用@Value("${document.location}")来取值,取到为null;
又综合了下各位大神的文章。
取值为null,有如下原因:
1、使用static或final修饰了tagValue,也就是说我的”filePath“变量是不能被static、final修饰的。
2、”filePath“变量所在的类必须是spring管理的类。比如加了@Component注解。
3、”filePath“变量所在的类实例对象不能是被new出来的。其实同上面一点原理一样。
参考链接:http://blog.csdn.net/zzmlake/article/details/54946346
但是…………以上都不是我所遇到的啊。
没办法,老老实实回头看自己的配置文件,突然发现,在context(spring容器)配置文件中通过"${}"取值是完全正常的。放到mvc(mvc容器)配置文件中就不得行了。而我的
<context:property-placeholder location="classpath:resources.properties"/>
是写到spring容器的配置中的。按理说mvc继承自context(不知道这个说法对不),应该也能取才对。
但是,在我往mvc容器的配置中加了如上配置后,取值就正常了。我也很无奈啊。
不知道有没有标准的统一的做法。还望大神留言。