1.@Value基本概念
@Value注解是Spring Framework中的一个注解,用于将配置文件中的属性值注入到Bean中。它可以用于注入简单类型的属性值、字符串、数组、集合等。
使用@Value注解可以将配置文件中的属性值注入到Bean中,例如:
@Component
public class MyComponent {
@Value("${my.property}")
private String myProperty;
// 省略其他方法
}
在上面的代码中,使用@Value注解将配置文件中名为"my.property"的属性值注入到MyComponent类的属性myProperty中。
@Value注解还可以用于注入数组类型的属性值,例如:
@Component
public class MyComponent {
@Value("${my.array}")
private String[] myArray;
// 省略其他方法
}
在上面的代码中,使用@Value注解将配置文件中名为"my.array"的属性值注入到MyComponent类的属性myArray中。
@Value注解还可以用于注入集合类型的属性值,例如:
@Component
public class MyComponent {
@Value("#{${my.map}}")
private Map<String, String> myMap;
// 省略其他方法
}
在上面的代码中,使用@Value注解将配置文件中名为"my.map"的属性值注入到MyComponent类的属性myMap中,并将其转换为Map<String, String>类型。
需要注意的是,@Value注解只能用于注入简单类型的属性值、字符串、数组、集合等,如果需要注入复杂类型的属性值,可以使用@PropertySource注解和Environment对象来实现。此外,@Value注解还可以用于注入SpEL表达式的值,例如:“#{systemProperties[‘user.name’]}”。
2.深入了解
了解@value的基础用法之后,有没有想过@value是怎么生效的呢,springboot是怎么将配制填充到类的成员变量中的呢?
之前看过一篇通过切面自定义注解的文章(https://juejin.cn/post/7129880941249429512)
通过@PointCut、@Around等注解结合aspectj来解析自定义的注解。
通过查看@Value的注释
Annotation used at the field or method/constructor parameter level that indicates a default value expression for the annotated element.
Typically used for expression-driven or property-driven dependency injection. Also supported for dynamic resolution of handler method arguments — for example, in Spring MVC.
A common use case is to inject values using #{
systemProperties.myProp} style SpEL (Spring Expression Language) expressions. Alternatively, values may be injected using ${
my.app.myProp}</