Spring @Value 注解使用示例

x33g5p2x  于2021-10-16 转载在 Spring  
字(3.6k)|赞(0)|评价(0)|浏览(458)

在本指南中,我们将向您展示 Spring @Value 注释的一些提示和技巧。 @Value 注释用于为变量和方法参数赋值。它是在 Spring 的 version 3.0 中引入的。

@Value 注释被广泛用于从 Spring/Boot 应用程序的属性文件中获取值。当我们开发基于微服务的应用程序并从属性文件中获取配置时,它非常有用。

1. 设置默认值/静态值

我们可以使用 @Value 注释分配具有默认/静态值的类成员变量。

// Set static string value
@Value("Success")
private String stringValue;

// Set default boolean value
@Value("true")
private boolean booleanValue;

// Set static integer value
@Value("101")
private int integerValue;

2. 从属性文件中获取值

@Value 注释不仅用于设置静态/默认值,还可以用于从属性文件中读取值。

2.1 获取字符串值

我们知道一个属性文件包含 keyvalue 对形式的值。

emp.message=Hi, I'm Manish and this message picked from a properties file.

为了获取键 emp.message 的值并将其设置为类成员变量,Spring 为我们提供了一些语法,即 双引号 » 美元符号 » 大括号 » 并且在大括号内是我们在属性文件.

@Value("${emp.message}")
private String empMessage;

默认情况下,@Value 注释在 Spring Boot 应用程序的 application.properties 文件中搜索 key

问题:等一下,当 key 丢失或者我们忘记在 @Value 注释中提到的属性文件中定义它时会发生什么?

答案:它将抛出 BeanCreationException:创建名为“employeeController”的 bean 时出错:自动装配依赖项的注入失败;嵌套异常是 java.lang.IllegalArgumentException:无法解析值 "${emp.message}" 中的占位符“emp.message”。

2.2 KEY 缺失时设置默认值

当属性文件中缺少或找不到键时,可以通过设置默认值来处理上述异常。

语法几乎与上面提到的相同,唯一的变化是我们必须设置我们的默认消息,紧跟在 key 之后的 colon (:)

双引号»美元符号»大括号»键»冒号(:)»您的默认消息

@Value("${emp.message.default: Hi, I'm employee default message.}")
private String degaultEmpMessage;

2.3 获取列表值

@Value 可以将逗号分隔的值分配给 List。假设我们有一个键 emp.list,它在属性文件中保存用逗号分隔的员工姓名。

emp.list=Atul, Manish, Santosh, Dhirendra

emp.list 值可以分配给如下列表:

@Value("${emp.list}")
private List<String> empList;

2.4 获取地图值

我们还可以在属性文件中以键值对的形式设置键值,并将这些值分配给 Map

emp.details={firstName: 'Manish', lastName: 'Fartiyal', company: 'Websparrow.org India Pvt. Ltd.'}

可以使用 Spring 表达式语言 (SpEL) 将其分配给 Map。在这种情况下,我们必须用 HASH (/#) 符号包围上述所有语法。

@Value("#{${emp.details}}")
private Map<String, String> empDetails;

让我们开始实际的编码并构建一个正在运行的应用程序。

3. application.properties

这是我们的默认属性文件,我们在其中设置键值对中的值。
application.properties

emp.message=Hi, I'm Manish and this message picked from properties file.
emp.list=Atul, Manish, Santosh, Dhirendra
emp.details={firstName: 'Manish', lastName: 'Fartiyal', company: 'Websparrow.org India Pvt. Ltd.'}

4. 控制器

EmployeeController 类,我们使用 @Value 注释从属性文件中获取值,并公开一个 REST 端点以显示在浏览器上。
EmployeeController.java

package org.websparrow.controller;

import java.util.List;
import java.util.Map;

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

@RestController
public class EmployeeController {

	@Value("Hi, My name is Atul.")
	private String staticMessage;

	@Value("${emp.message}")
	private String empMessage;

	@Value("${emp.message.default: Hi, I'm employee default message.}")
	private String defaultEmpMessage;

	@Value("${emp.list}")
	private List<String> empList;

	@Value("#{${emp.details}}")
	private Map<String, String> empDetails;

	@GetMapping("/employee")
	public String employeeInfo() {

		return toString();
	}

	@Override
	public String toString() {
		return "Static Message= " + staticMessage + "</br>" 
				+ " Employee Message=" + empMessage + "</br>"
				+ "Default employee message when key is not found= " + defaultEmpMessage + "</br>"
				+ " List of all employees= " + empList + "</br>"
				+ " Size of employees= " + empList.size() + "</br>"
				+ "Empoyee details= " + empDetails;
	}

}

5. 运行应用程序

package org.websparrow;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringValueAnnotationApp {

	public static void main(String[] args) {
		SpringApplication.run(SpringValueAnnotationApp.class, args);
	}
}

6. 测试应用程序

要测试应用程序,请通过执行上述类来启动 Spring Boot 应用程序,然后在您喜欢的 Web 浏览器中点击以下 API:

API:http://localhost:8080/employee

你会得到以下响应:

相关文章