@Value是如何将外部化配置注入到spring bean中

本文详细介绍了Spring框架中@Value注解的三种注入方式:基于配置文件注入、非配置文件注入和默认值注入。通过@Value可以从配置文件读取属性值,如application.properties和自定义配置,也可以通过SpEL注入操作系统属性、表达式结果等。同时展示了如何设置默认值,当配置为空时使用默认值填充。
摘要由CSDN通过智能技术生成

有三种注入方式,分别是基于配置文件注入、基于非配置文件注入、默认值注入。

1、配置文件

基于配置文件注入,顾名思义起源头来自于配置文件。这些配置文件诸如application.properties或自定义的*.properties文件。

例如,application.properties配置文件中定义属性值的形式如下:
user.name=admin
假设存在自定义配置文件my.properties,配置文件中定义的属性如下:

user.password=123456

如果需要做在类中使用这两个配置值如何做呢,看如下编码:

@PropertySource(“classpath:my.properties”)

@RestController

public class ValueController {

/**

* 获取位于application.properties中配置的属性

*/

@Value("${user.name}")

private String name;

/**

* 获取位于my.properties中的配置属性

*/

@Value("${user.password}")

private String password;

}

从上面代码可以看出从application.properties配置中获取user.name的信息填充到变量name中,再从自定义配置文件my.properties中获取user.password信息填充到password变量中。

需要注意的是,如果是自定义的my.properties文件,需要在某个类中通过@PropertySource引入该配置文件,而application.properties中的属性会自动被加载。

通过@Value注入单个属性的同时,也可以注入数组和列表形式。如果存在以下配置:

tools=car,train,airplane

那么可以通过如下代码进行注入:

/**

  • 注入数组(自动根据","分割)

*/

@Value("${tools}")

private String[] toolArray;

/**

  • 注入列表形式(自动根据","分割)

*/

@Value("${tools}")

private List toolList;

Spring默认情况下会以“,”进行分割,将配置文件中的tool包含内容切割成“car”、“train”、“airplane”组成的数组或者列表然后保存到toolArray的数组和toolList的列表中。

2、非配置文件

基于非配置文件注入,需要用到SpEL(Spring Expression Language)即Spring表达式语言对@Value进行修饰从而传递配置信息。

下面就来看看应用场景:

注入普通字符串,相当于直接给属性默认值,代码如下:

@Value(“测试”)

private String wechatSubscription;

注入操作系统属性,例如操作系统的名字,代码如下:

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

private String systemPropertiesName;

注入表达式结果,代码如下:

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

private double randomNumber;

注入其他Bean属性:注入config对象的属性tool,代码如下:

@Value("#{config.tool}")

private String tool;

注入列表形式(自动根据"|"分割),代码如下:

@Value("#{’${words}’.split(’\|’)}")

private List numList;

注入文件资源,代码如下:

@Value(“classpath:config.xml”)

private Resource resourceFile;

注入URL资源,代码如下:

@Value(“http://www.choupangxia.com”)

private URL homePage;

3、默认值

说了配置文件和非配置文件的@Value注入,这里再加入默认值的注入方式,顾名思义就是在配置为空或者没有设置具体值的时候,使用的默认值填充目标对象。这里我们整理了几种情况供大家参考。

如果属性中未配置IP,则使用默认值,代码如下:

@Value("${ip:127.0.0.1}")

private String ip;

如果系统属性中未获取到port的值,则使用8888,代码如下:

@Value("#{systemProperties[‘port’]?:‘8888’}")

private String port;

其中${}中直接使用“:”对未定义或为空的值进行默认值设置,而#{}则需要使用“?:”对未设置的属性进行默认值设置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值