spring注解:@Value在使用中遇到的问题

怪盗基德 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标签,感觉更简洁,如下:

<context:property-placeholder location="classpath:resources.properties"/>

 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容器的配置中加了如上配置后,取值就正常了。我也很无奈啊。

不知道有没有标准的统一的做法。还望大神留言。

相关推荐