文章目录
- 注入配置文件里面的属性
- boolean类型设置默认值的注意点
- 直接注入字符串
- 注入数组
- 注入集合(数组,list,set等)
- 注入set
- 注入集合的问题
- 使用SpEl表达式注入
- 注入操作系统属性
- 注入容器中对象的属性
- 基于对象注入
- 注入文件
- 注入网址内容
- 其他
- 记一次诡异事件
@Value注解谁都用过,但还是有点细节的。
注入配置文件里面的属性
@value("${name}")
private String name;
使用冒号可以设置默认值,当属性不存在时使用默认值:
@value("${name:zhangsan}")
private String name;
boolean类型设置默认值的注意点
boolean类型设置默认值会报错。
代码:
@Value("testFlag:false")
private boolean testFlag ;
报错信息:
org.springframework.beans.TypeMismatchException: Failed to convert value of type ‘java.lang.String’ to required type ‘boolean’; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [redIssueReasonFixFlag:false]
解决方案:
1、boolean的默认值是false。一般情况下干脆不用默认值就好。
2、如果要改的话涉及到spring源码了,需要修改PropertyPlaceholderHelper对象,略。
直接注入字符串
@value("zhangsan")
private String name;
注入数组
配置文件:
user.types=1,3,5
java代码为:
@Value("${user.types}")
private String[] types;
数组中可以设置默认值吗?当然可以。
注:冒号后面直接写1,2,3即可,不用加中括号。
@Value("${user.types:1,4,5,7,9,13}")
private String[] type;
注入集合(数组,list,set等)
注入set
java代码:
@Value("${urlList:'test/','api/'}")
private static Set<String> urlList = Sets.newHashSet("test/","api/");
application.yml:
urlList: test/,api/
注,以下写法错:
urlList: 'test/','api/'
所以带有空格的字符串是没法弄的,但是话又说回来,路径也不能含有空格啊。
注入集合的问题
还有一个问题,
@Order(1)
@Component
@WebFilter(filterName = "MainFileter", urlPatterns = "/*")
在controller中是列表,在Filter中为什么是字符串呢?
使用SpEl表达式注入
SpEl表达式支持加减乘除,这里只举一例:
@Value("#{5*2}")
private Double number;
注入操作系统属性
@Value("#{systemProperties['os.name']}")
private String osName; // 例如: Windows 7
注入容器中对象的属性
@Component
@Data
public class Student {
@Value("yangyanzhao")
private String name;
}
// =========== 另一个类中这么写
@Value("#{student.name}")
private String studentName;
基于对象注入
注入文件
@Value("classpath:aaa.txt")
private Resource file;
注入网址内容
@Value("http://www.baidu.com")
private Resource baidu;
其他
记一次诡异事件
yml中配置的为:
httpDomain: www.test.com
service代码为:
@Value("${httpDomain}")
private String httpDomain;
启动项目报错:
Could not resolve placeholder ‘httpDomain’ in value “${httpDomain}”
真是怪了,我都开始怀疑我自己了。
难道是service中不能用@Value注入? 没道理啊。
左查右查,前查后查。 发现代码没问题啊,就是启动报错。
那是jdk的问题? idea的问题?
最后发现是yml中分为多profile。 配置写到其他profile中了。 找不到这个变量,当然报错。
那时正是开发的紧张期,时间很宝贵。 由于大意,白白浪费了一小时。 真恨不得抽自己几个耳光。
所以一定要细心,另: 这种注入错误一般是没找到配置。