笔者结合之前的一些经验教训,再结合一些资料总结了一下@Value注解使用过程中的一些注意事项。
目录
- 一、@Value无法读取配置文件中的参数
- 二、@Value出现中文乱码
- 三、@Value使用的一些小技巧
- 1、@Value注解可以解读字符串数组
- 2、@Value注解可以直接注入对象
以下所有的配置的前提是注解必须是放置于Spring组件中才能生效
一、@Value无法读取配置文件中的参数
这个坑是笔者前段时间自建springboot项目的时候发现的,当时笔者想在配置文件中加一些参数,然后使用这个注解直接调用,可是发现无路如何也获取不到这个参数(笔者用的是配置文件)。
原因:springboot项目是无法识别bootstrap文件的,springboot项目默认的配置文件是,所以如果将参数写入bootstrap配置文件,然后再用@Value注解,是无法读取参数的。
解决办法:
- 1、将参数写到配置文件中;
- 2、添加下方的依赖,让springboot也能识别的配置文件;
<dependency>
<groupId></groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.1</version>
</dependency>
二、@Value出现中文乱码
笔者也是在今天配置一个中文路径的时候发现的这个问题,当时报的异常是无法找到目标文件,仔细一检查才发现中文乱码的问题。
原因:用@Value注解读取文件时,编码默认是ISO-8859-1,所以直接配置中文一定会乱码。
解决办法:
- 1、通过@PropertySource(value=“classpath:”, encoding=“UTF-8”)注解配置自定义配置文件,注意文件名不能是springboot默认的文件名称;
- 2、使用yml/yaml格式的配置文件配置中文参数,springboot读该文件默认采用UTF-8编码。
三、@Value使用的一些小技巧
1、@Value注解可以解读字符串数组
只需要在配置文件中将两个字符串以逗号隔开,然后添加@Value注解的属性用字符串集合接收,就可以达到读取字符串数组的的目的。下面是示例代码:
Java中的接收属性
@Value("${}")
private List<String> whitePaths;
配置文件中的配置属性
=,,
2、@Value注解可以直接注入对象
只需要在@Value属性中使用#{}就可以指定读取对象了,如下:
@Value("#{userService}")
private UserService userService;
注意:userService是对象注入到spring容器所使用的beanName,如果userService对应的类型并不是当前属性需要的类型的话,会抛异常