简介

        本文用示例介绍SpringBoot的@Value的用法。

分类

@Value属性注入功能根据注入的内容来源可分为两类:通过配置文件的属性注入和通过非配置文件的属性注入。 

通过配置文件的注入根据配置文件的来源又可分为两类:

  1. 默认的Spring Boot会自动加载的配置文件application.properties中的属性;
  2. 自定义配置文件中的属性,需要先通过@PropertySource加载。

非配置文件注入的类型又分为:

  • 注入普通字符串
  • 注入操作系统属性
  • 注入表达式结果
  • 注入其他Bean属性
  • 注入文件资源
  • 注入URL资源

@ConfigurationProperties与@Value


@ConfigurationProperties

@Value

类型

Map、内部类、对象等。

不支持内部类、对象。

spEl表达式

不支持

支持

JSR303数据校验

支持

不支持

功能

一个列属性批量注入

单属性注入

基于配置文件注入

常用操作

application.properties

user.name=admin

@Value在Bean中的使用(注解到字段上)

@RestController
public class ValueController {
@Value("${user.name}")
private String name;

@Value("${user.password}")
private String password;
}

 @Value在Bean中的使用(注解到参数上)

@RestController
public class ValueController {
private String password;

ValueController(@Value("${user.password}")private String password){
this.password = password
}
}

还可以注入数组和列表形式

application.properties

tools=car,train,airplane
// 注入数组(自动根据","分割)
@Value("${tools}")
private String[] toolArray;

// 注入列表形式(自动根据","分割)
@Value("${tools}")
private List<String> toolList;

可拼接字符串

application.yml

custom:
name: hello

Controller

package com.knife.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
@Value("my name is: " + "${custom.name}")
private String name;

@GetMapping("/test")
public String test() {

return name;
}
}

访问:​​http://localhost:8080/test​

结果:

SpringBoot--注解--@Value--使用/教程/实例_java

可指定配置文件

 my.properties

user.password=pwd123

@Value在Bean中的使用(注解到字段上)

@PropertySource("classpath:my.properties")
@RestController
public class ValueController {
@Value("${user.name}")
private String name;

@Value("${user.password}")
private String password;
}

 @Value在Bean中的使用(注解到参数上)

@PropertySource("classpath:my.properties")
@RestController
public class ValueController {
private String password;

ValueController(@Value("${user.password}")private String password){
this.password = password
}
}

默认值注入

        无论使用#{}或${}进行属性的注入,当无法获取对应值时需要设置默认值,可以采用如下方式来进行设置。

// 如果属性中未配置ip,则使用默认值
@Value("${ip:127.0.0.1}")
private String ip;

// 如果属性中未配置username,则使用默认值(空字符串)
@Value("${username:}")
private String ip;

// 如果系统属性中未获取到port的值,则使用8888。
@Value("#{systemProperties['port']?:'8888'}")
private String port;

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

SpEL

        SpEL(Spring Expression Language)即Spring表达式语言,可以在运行时查询和操作数据。使用#{…}作为定界符, 所有在大括号中的字符都将被认为是 SpEL。

// 注入普通字符串,相当于直接给属性默认值
@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<String> numList;

// 注入文件资源
@Value("classpath:config.xml")
private Resource resourceFile;

// 注入URL资源
@Value("http://www.choupangxia.com")
private URL homePage;

其他网址

​SpringBoot之Spring@Value属性注入使用详解 - 云+社区 - 腾讯云​​​​A Quick Guide to Spring @Value | Baeldung​