@Value,@ConfigurationProperties,@EnableConfigurationProperties,@PropertySource,@PropertySources

本文详细介绍了Spring框架中用于属性注入的注解,包括@Value的使用,如注入普通字符串、操作系统属性、表达式结果等;@ConfigurationProperties和@EnableConfigurationProperties的配合使用,实现Bean的按需配置;以及@PropertySource和@PropertySources注解加载外部属性文件。通过实例解析了各种注解的用法和区别。
摘要由CSDN通过智能技术生成

@Value 注解可以用来将外部的值动态注入到 Bean 中,在 @Value 注解中,可以使用 ${} 或 #{}。${} 与 #{} 的区别如下:

(1)@Value("${}"):可以获取对应属性文件中定义的属性值。

(2)@Value("#{}"):表示 SpEl 表达式通常用来获取 bean 的属性,或者调用 bean 的某个方法。

@Value 注解的常用使用方式如下:

注入普通字符串

属性文件内容如下:

1

str1=hello world

Java代码如下:

1

2

3

4

5

6

7

// 直接将字符串赋值给 str 属性

@Value("hello world")

private String str;

// 从属性文件中获取值

@Value("${str1}")

private String str1; // 结果:hello world

如果在属性文件中没有定义 str1 属性名,则 @Value 会抛出如下错误“java.lang.IllegalArgumentException: Could not resolve placeholder 'str1' in value "${str1}"”。我们可以在 str1 属性不存在时,指定默认值,即使没有定义 str2 也不会抛出错误,而是返回默认值。如下:

1

2

@Value("${str2:defaultValue}")

private String str2; // 结果:defaultValue

注入操作系统属性

可以利用 @Value 注入操作系统属性。这里我们不能使用“${}”去获取操作系统属性。如下:

1

2

@Value("${systemProperties['os.name']}")

private String osName;

上面代码将抛出 java.lang.IllegalArgumentException: Could not resolve placeholder 'systemProperties['os.name']' in value "${systemProperties['os.name']}" 错误信息。你需要将 ${} 改为 #{},如下:

1

2

@Value("#{systemProperties['os.name']}")

private String osName; // 结果:Windows 10

注入表达式结果

在 @Value 中,允许我们使用表达式,然后自动计算表达式的结果。将结果复制给指定的变量。如下:

1

2

3

4

5

6

7

// 生成一个随机数

@Value("#{ T(java.lang.Math).random() * 1000.0 }")

private double randomNumber;

// 使用 System 类获取系统环境变量 PATH

@Value("#{ T(java.lang.System).getenv('path') }")

private String path;

注入其他Bean属性

在 @Value 注解中,也可以将其他 bean 的属性值注入到当前 bean。如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 其他Bean

@Component

public class OtherBean {

    @Value("OtherBean的NAME属性")

    private String name;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

}

// 用法

@Component

public class MyBean {

    @Value("#{otherBean.name}")

    private String fromAnotherBean;

    // ...

}

注意,其他 bean 使用 @Component 时,如果没有指定名称,则默认为类名首字母小写,如:otherBean 。当然我们也可以使用 @Component("myName") 形式,指定其他 bean 的名称,此时,访问则需要使用 @Value("#{myName.name}")。如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 其他bean,自定义名称为 myBeans

@Component("myBeans")

public class OtherBean2 {

    @Value("OtherBean的NAME属性")

    private String name;

    public String getName() {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值