`
jinnianshilongnian
  • 浏览: 21504328 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2418716
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008849
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5639515
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259938
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597357
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250234
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858980
Group-logo
跟我学Nginx+Lua开...
浏览量:702015
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785233
社区版块
存档分类
最新评论

@Value注入Properties 使用错误的案例

 
阅读更多

最近有朋友问@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。

12
1
分享到:
评论
4 楼 sunshine_bean 2014-12-18  
每次看你的blog都有收获,谢谢
3 楼 melody_nancy 2012-11-19  
good,thx
2 楼 jinnianshilongnian 2012-10-24  
thc1987 写道
挺好的,知其然,知其所以然.

1 楼 thc1987 2012-10-24  
挺好的,知其然,知其所以然.

相关推荐

    示例代码-SpringBoot踩坑记录:玩转@Value注解-自定义PropertySourcesPlaceHolderConfigurer.zip

    在Spring Boot应用中,`@Value`注解是开发者经常使用的工具,用于注入配置属性值。这个注解可以从`application.properties`或`application.yml`等配置文件中读取值,并将其注入到字段、方法参数或者构造函数参数中。...

    ssh2注解登录保存简单案例

    最后,为了确保案例的绝对可用性,你需要确保所有的配置参数(如 host、port、username、password)已经正确地注入到应用环境中,这可以通过 properties 文件或者其他配置管理工具来实现。此外,SQL 语句应当经过...

    【SpringBoot探索三】添加配置文件参考案例

    - **@Value注解**:可以直接在字段或方法参数上使用`@Value`注解来注入配置属性。 - **@ConfigurationProperties**:对于复杂的配置数据,可以使用`@ConfigurationProperties`注解创建一个Java Bean,将配置文件中...

    实验4.docx

    1. **掌握Spring Boot的核心配置方式**:包括全局配置文件(`application.properties`或`application.yaml`)的使用。 2. **熟悉Spring Boot注解的使用**:如`@ConfigurationProperties`和`@Value`等注解的应用场景...

    nacos配置中心初始化案例

    在Spring Boot的Bean中,可以使用@NacosValue注解注入从Nacos获取的配置值。例如: ```java @NacosValue(value = "${your.config.key}", autoRefreshed = true) private String yourConfigValue; ``` 五、动态刷新...

    Spring Boot核心技术.rar

    `@Value`注解可以从属性文件中注入值,如 `${property.name}`,这样可以在类中直接使用配置文件中的属性值。 4. **SpringBoot整合Freemarker**: Freemarker是一个模板引擎,用于生成动态HTML、XML等文档。Spring...

    Spring-boot 入门案例

    通过 `@Value` 注解或 `@ConfigurationProperties` 将配置值注入到 Bean 中。 ```properties # application.properties message.hello=你好,Spring Boot! @Configuration @ConfigurationProperties(prefix = ...

    spring boot搭建Linux文件系统案例

    在Spring Boot中,可以使用`@Value`注解注入配置文件(如`application.properties`或`application.yml`)中的路径变量。然后,使用Java的I/O操作,如`FileOutputStream`,将`MultipartFile`的内容写入到指定的文件...

    java发送邮件jar包

    在这个案例中,它为使用JavaMail发送邮件提供了便利,整合了JavaMail API和Spring的IoC(Inversion of Control)特性。 要使用这些库来发送邮件,你需要配置一个`JavaMailSender`接口的实现,如`SimpleMailMessage`...

    Spring Cache使用RedisCache案例解析

    Spring Cache使用RedisCache案例解析 Spring Cache是Spring框架中的一种缓存机制,主要用于优化应用程序的性能和响应速度。通过使用缓存,可以减少对数据库的访问次数,降低系统的负载,提高系统的整体性能。在...

    SpringBoot-第一天.pdf

    - @Value:用于属性上,获取properties文件中指定的key对应的value值。 5. Maven配置 - 提供了创建Spring普通工程的示例,包括groupId、artifactId、version的设置,以及添加坐标相关配置。 - 示例中展示了如何...

    springboot集成mybatis案例.zip

    现在,我们可以直接在服务类中使用注入的Mapper实例来执行SQL查询,比如获取所有用户: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List&lt;User&gt; getAll...

    多环境配置多种实现

    4. **配置注入**:在Java代码中,我们可以使用`@Value`或`@ConfigurationProperties`注解来注入配置值。`@Value`适用于简单的属性,而`@ConfigurationProperties`适用于复杂的对象结构,它会自动绑定到一个JavaBean...

    Spring Boot实战派(源码)

    - 使用`@Value`注解注入配置值。 9. **测试支持** - Spring Boot提供`SpringBootTest`注解进行集成测试,`@MockBean`和`@SpyBean`用于模拟或监控bean。 10. **定时任务** - 使用`@Scheduled`注解实现定时任务,...

    SpringBoot企业级开发教程_源代码.zip

    源代码中会展示如何通过`@Value`注解注入配置属性。 7. **Actuator**: SpringBoot Actuator提供了许多监控和管理应用的端点。通过`spring-boot-starter-actuator`起步依赖,可以查看应用的健康状况、指标、日志等...

    SpringBoot集成MyBatisEclipse工程代码入门案例

    你可以通过编写控制器类(Controller)来实现业务逻辑,并使用`@Autowired`注解注入`UserMapper`接口,调用其方法进行数据库操作。 例如,创建一个`UserController`,处理HTTP请求: ```java @RestController @...

    Spring框架是在2003年兴起的一门轻量级的JAVAEE框架技术 Spring框架学习资料第一天

    给properties类型注入 6. 自定义对象类型属性注入 7. list集合泛型是自定义对象类型的属性 8. map集合的value是一个自定义对象类型的属性 五、IOC和DI * IOC(Inverse Of Control)称为控制反转:是指将创建...

    Spring_SpEl表达式使用用例

    Spring允许在配置中使用SpEL表达式作为占位符,如`@Value("#{systemProperties['java.version']}")`,这将注入Java版本号到bean的属性中。 7. **T()和P()函数** `T()`函数用于引入类型,如`T(java.util.Date)`...

    spring4_day02讲义1

    - **步骤六**:在目标类上添加注解,如`@Component`,并可以通过`@Value`、`@Autowired`等注解进行属性注入。 2. **AOP(面向切面编程)**: - **AOP在DAO层的增强**:在本案例中,目标是为所有以`save`开头的...

    Spring Boot 发送邮件功能案例分析

    我们可以使用 @Autowired 注解来注入 JavaMailSender 实例,然后使用它来发送邮件。在 sendSimpleMail 方法中,我们创建了一个 SimpleMailMessage 实例,并设置了邮件的发送人、接收人、主题和内容,然后使用 sender...

Global site tag (gtag.js) - Google Analytics