这里讲一下,spring
的 @value
注解。
参考资料
相关教程
介绍
它的作用是将配置文件中 key
对应的值赋值给它标注的属性。
@Value
属性注入功能根据注入的内容来源可分为两类:
- 通过配置文件的属性注入
- 通过非配置文件的属性注入。
通过配置文件的注入根据配置文件的来源又可分为两类:
- 一类为默认的
Spring Boot
会自动加载的配置文件application.properties
中的属性 - 另一类为自定义配置文件中的属性,需要先通过
@PropertySource
加载。
而非配置文件注入的类型又分为:
- 注入普通字符串
- 注入操作系统属性
- 注入表达式结果
- 注入其他Bean属性
- 注入文件资源
- 注入URL资源
基于配置文件注入
首先来看数据来源自配置文件的注入,无论是会被默认加载的 application.properties
或自定义的 my.properties
文件。比如,application.properties
中定义属性值的形式如下:
1 | user.name=admin |
在 my.properties
配置文件中定义的属性如下:
1 | user.password=pwd123 |
那么,@Value
在Bean
中的使用形式为:
1 | "classpath:my.properties") ( |
同时,不仅仅可以通过 @Value
注入单个属性,还可以注入数组和列表形式。比如如下配置:
1 | tools=car,train,airplane |
可以通过以下方式注入:
1 | /** |
Spring
默认情况下会以,
进行分割,转换成对应的数组或列表。
基于非配置文件注入
在使用实例说明基于非配置文件注入属性的实例之前,我们先了解一下SpEL
。
SpEL(Spring Expression Language)
即Spring
表达式语言,可以在运行时查询和操作数据。使用#{...}
作为定界符, 所有在大括号中的字符都将被认为是 SpEL
。
下面看具体实例场景的应用:
1 | /** |
在上述示例分别展示了以下场景的使用:
- 直接注入字符串,相当于实例化时直接初始化字符串。
- 通过
#{}
注入系统属性。 - 通过
#{}
注入表达式结果。 - 通过
#{}
注入其他Bean的属性。 - 通过
#{}
和${}
的组合注入属性并进行分割处理。 - 注入文件资源,将对应的字符串值转换成对应的资源文件。
- 注入
URL
资源,将对应的URL
字符串转换成URL
。
其中需要注意的是:
Resource
的全限定名为org.springframework.core.io.Resource
。
二者结合使用时(#{'${}'}
),注意单引号,注意不能反过来。
默认值注入
无论使用#{}
或${}
进行属性的注入,当无法获取对应值时需要设置默认值,可以采用如下方式来进行设置。
1 | /** |
其中${}
中直接使用:
对未定义或为空的值进行默认值设置,而#{}
则需要使用?:
对未设置的属性进行默认值设置。
注意点
- 不能作用于静态变量(
static
) - 不能作用于常量(
final
) - 不能在非注册的类中使用(类需要被注册在spring上下文中,如用
@Service
,@RestController
,@Component
等); - 使用这个类时,只能通过依赖注入的方式,用
new
的方式是不会自动注入这些配置的。