Spring Boot系列五 Spring @Value 属性注入使用总结二
2017-05-17 22:37
876 查看
1. @Value注入二
在上一篇文章中Spring @Value 属性注入使用总结一我们介绍了@Value的常用方式。看完文章你可能迷惑#{..}和${}有什么区别以及如何使用。这篇文章,我们尝试解决这个问题1.1 前提
测试属性文件:advance_value_inject.propertiesserver.name=server1,server2,server3 #spelDefault.value=notdefault HelloWorld_=sss
测试类AdvanceValueInject:引入advance_value_inject.properties文件,作为属性的注入
@Component @PropertySource({"classpath:com/hry/spring/configinject/advance_value_inject.properties"}) public class AdvanceValueInject { ... }
1.2 #{…}和${…} ###
#{…}用法通过@Value(“${spelDefault.value}”)可以获取属性文件中对应的值,但是如果属性文件中没有这个属性,则会报错。可以通过赋予默认值解决这个问题,如
@Value("${spelDefault.value:127.0.0.1}")
详细代码如下:
// 如果属性文件没有spelDefault.value,则会报错 // @Value("${spelDefault.value}") // private String spelDefault2; // 使用default.value设置值,如果不存在则使用默认值 @Value("${spelDefault.value:127.0.0.1}") private String spelDefault;
${…}用法
${…}的{}里面的内容必须符合SpEL表达式,详细的语法,以后可以专门开新的文章介绍,这里只演示简单用法:
// SpEL:调用字符串Hello World的concat方法 @Value("#{'Hello World'.concat('!')}") private String helloWorld; // SpEL: 调用字符串的getBytes方法,然后调用length属性 @Value("#{'Hello World'.bytes.length}") private String helloWorldbytes;
${…}和#{…}混合使用
${...}和#{...}可以混合使用,如下文代码执行顺序:通过${server.name}从属性文件中获取值并进行替换,然后就变成了 执行SpEL表达式#{‘server1,server2,server3’.split(‘,’)}。
// SpEL: 传入一个字符串,根据","切分后插入列表中, #{}和${}配置使用(注意单引号,注意不能反过来${}在外面,#{}在里面) @Value("#{'${server.name}'.split(',')}") private List<String> servers;
在上文中在
#{}外面,${}在里面可以执行成功,那么反过来是否可以呢
${}在外面,#{}在里面,如代码
// SpEL: 注意不能反过来${}在外面,#{}在里面,这个会执行失败 @Value("${#{'HelloWorld'.concat('_')}}") private List<String> servers2;
答案是不能。因为spring执行${}是时机要早于#{}。在本例中,Spring会尝试从属性中查找#{‘HelloWorld’.concat(‘_’)},那么肯定找到,由上文已知如果找不到,然后报错。所以
${}在外面,#{}在里面是非法操作
小结
#{…} 主要用于加载外部属性文件中的值
${…} 用于执行SpEl表达式,并将内容赋值给属性
#{…} 和${…} 可以混合使用,但是必须
#{}外面,${}在里面
2. 代码
上文代码见Github相关文章推荐
- Spring Boot系列四 Spring @Value 属性注入使用总结一(转载)
- Spring Boot系列四 Spring @Value 属性注入使用总结一
- Spring Boot系列 Spring @Value 属性注入使用总结一
- Spring系列【09】使用<prop>标签为Java持久属性集注入值
- Redis系列三 - Spring boot如何使用redis做缓存及缓存注解的用法总结
- Redis系列三 - Spring boot如何使用redis做缓存及缓存注解的用法总结
- [Spring Boot实战系列] - No.4 Spring boot 中如何在Utils类中使用@Autowired注入bean
- Redis系列三 - Spring boot如何使用redis做缓存及缓存注解的用法总结
- (16)Spring Boot使用Druid(编程注入)【从零开始学Spring Boot】
- 使用Spring注解来注入属性
- Spring Boot 属性配置和使用
- 从头认识Spring-2.6 在注解中使用表达式@Value(2)-使用表达式注入其他对象的值
- Spring boot将配置属性注入到bean类中
- 使用spring进行属性注入的实例解析(spring面向切面和控制反转)。
- JAVA_OA管理系统(四)番外篇:使用Spring注解注入属性
- 从头认识Spring-2.6 在注解中使用表达式@Value(1)-注入普通值
- Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
- spring 为某类注入的属性 其子类无法使用
- SpringBoot配置属性系列
- 使用Spring注解注入属性