最近有朋友问@Value注入Properties数据注入不进去,接下来我就分析一下为什么。
场景:
需要注入Properties的value数据到Bean或方法参数。
准备数据:
<bean id="props" class="java.util.Properties">
<constructor-arg index="0">
<props>
<prop key="a">123</prop>
</props>
</constructor-arg>
</bean>
<bean id="map" class="java.util.HashMap">
<constructor-arg index="0">
<map>
<entry key="a" value="234"/>
</map>
</constructor-arg>
</bean>
失败的做法:
@Value("#{props['a']}")
private String propsA;
此时无法获取props的a这个键对应的值。
正确的做法:
@Value("#{props.getProperty('a')}")
private String propsA;
@Value("#{map['a']}")
private String mapA;
@RequestMapping(value="/value2")
public String test2(@Value("#{props.getProperty('a')}") String propsA, @Value("#{map['a']}") String mapA) {
为什么?最后探讨。
最好的正确做法:
<util:properties id="props2">
<prop key="a">123</prop>
</util:properties>
//该标签内部使用org.springframework.beans.factory.config.PropertiesFactoryBean FactoryBean实现;
@Value("#{props2['a']}") String props2A,
注入数据直接使用props[key]即可。
why?
为什么如下方式不行:
<bean id="props" class="java.util.Properties">
<constructor-arg index="0">
<props>
<prop key="a">123</prop>
</props>
</constructor-arg>
</bean>
而如下这种方式行呢?
<util:properties id="props2">
<prop key="a">123</prop>
</util:properties>
原因很简单:API不熟造成的:
1、首先我们来看下Properties构造器定义:
javadoc 写道
public Properties(Properties defaults)创建一个带有指定默认值的空属性列表。
参数:
defaults - 默认值。
1)、构造器第一个参数是默认值;
2)、当我们使用getProperty(key) 时,首先查自己的prop,如果有直接返回,否则查defaults中的key。
javadoc 写道
public String getProperty(String key)
用指定的键在此属性列表中搜索属性。如果在此属性列表中未找到该键,则接着递归检查默认属性列表及其默认值。如果未找到属性,则此方法返回 null。
3)、原因到此很明显了,此时我们使用#{props.getProperty('a')} 其实是查的defaults
4)、Properties本身继承了Hashtable,其实是一种错误的用法,造成了我们现在的我们现在的问题,get(key)只查自己,而getProperty会先查自己 再查defaults。
2、而使用<util:properties id="props2"> 本身是一个FactoryBean,帮我们创建没有我们真实需要的properties。有兴趣可以看下源代码。
总结:
1、API不熟造成了错误理解(以为类似于如集合框架是做拷贝);
2、Properties继承Hashtable本身就是一种错误的继承,形成两套不同的API。
分享到:
相关推荐
MarkDown文档,大家应该都知道,@Value注解可以给类中的非静态变量注入值,但是给静态变量注入值则会有警告,结果是失败的,本文档说明了如何使用@Value注解给类的静态变量赋值
Spring Boot系列四 Spring @Value 属性注入使用总结一
主要介绍了结合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
主要介绍了Springboot中@Value的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要介绍了Spring中利用配置文件和@value注入属性值代码详解,代码中注释比较详细,具有一定参考价值,需要的朋友可以了解下。
spring-demo13-注解-@Value.zip
自己开发一个工具类,为第三方应用提供调用接口,但是打包后测试过程中,发现了一个问题就是在用@Value获取配置文件内容的时候,无法获取我们的配置信息,也无法加载我们配置的默认值!具体配置如下: @Value("${...
Spring Boot技术知识点:如何理解@Value注解
1.19 @Value注入Properties 错误的使用案例 1.20 @Value注入Properties 使用错误的案例 1.21 扩展SpringMVC以支持更精准的数据绑定 1.22 扩展SpringMVC以支持更精准的数据绑定1 1.23 扩展SpringMVC以支持绑定JSON...
主要介绍了Spring@Value属性注入使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Springboot @Value获取值为空问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
属性赋值@Value1
Spring 自定义注解注入properties文件的值jar包,下面为使用方法 在xml配置文件中,这样加载properties文件 ...
主要介绍了Springboot @Value使用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Springboot在有参构造方法类中使用@Value注解取值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本篇文章主要介绍了详解Spring通过@Value注解注入属性的几种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
主要介绍了Spring EL表示式的运用@Value说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本篇文章主要介绍了spring中@value注解需要注意的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了Spring @Value注解失效问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
CREATE FUNCTION BigInt2HexStr(@value BIGINT) RETURNS VARCHAR(50) AS BEGIN DECLARE @seq CHAR(2) DECLARE @result VARCHAR(50) DECLARE @digit CHAR(1) SET @seq = '0123456789ABCDEF' --求十进制的@value...