【Spring Boot 中 `@Value` 注解的利用】

打印 上一主题 下一主题

主题 1865|帖子 1865|积分 5599

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

一、媒介

在 Spring Boot 项目中通常需要从 application.properties 或 application.yml 设置文件中读取设置信息。@Value 注解提供了一种简单的方式来将设置值注入到 Spring 组件中。

二、@Value 注解简介

@Value 是 Spring 提供的一个注解,用于从设置文件或其他来源(如系统环境变量、SpEL 表达式)中读取值并注入到 Bean 的字段或方法参数中。其基本语法如下:
  1. @Value("${property.key}")
  2. private String propertyValue;
复制代码

三、@Value 注解的常见用法

1. 读取 application.properties 或 application.yml 设置值

(1)设置文件示例

application.properties
  1. app.name=Spring Boot Demo
  2. app.version=1.0.0
复制代码
application.yml
  1. app:
  2.   name: Spring Boot Demo
  3.   version: 1.0.0
复制代码
(2)Java 代码示例

  1. @Component
  2. public class AppConfig {
  3.     @Value("${app.name}")
  4.     private String appName;
  5.     @Value("${app.version}")
  6.     private String appVersion;
  7.     public void printConfig() {
  8.         System.out.println("Application Name: " + appName);
  9.         System.out.println("Application Version: " + appVersion);
  10.     }
  11. }
复制代码
(3)测试输出

  1. Application Name: Spring Boot Demo
  2. Application Version: 1.0.0
复制代码

2. 利用 @Value 设置默认值

如果设置文件中未定义某个属性,则 @Value 注解可以提供一个默认值。默认值的语法是 {defaultValue}:
  1. @Component
  2. public class DefaultValueExample {
  3.     @Value("${app.author:Unknown Author}")
  4.     private String author;
  5.     public void printAuthor() {
  6.         System.out.println("Application Author: " + author);
  7.     }
  8. }
复制代码
如果 application.properties 或 application.yml 中未设置 app.author,则输出:
  1. Application Author: Unknown Author
复制代码

3. 读取系统环境变量和 Java 运行时参数

@Value 也可以用于读取系统环境变量或 -D 方式通报的 JVM 运行参数:
  1. @Component
  2. public class EnvConfig {
  3.     @Value("${JAVA_HOME}")
  4.     private String javaHome;
  5.     @Value("${user.name}")
  6.     private String userName;
  7.     public void printSystemProperties() {
  8.         System.out.println("JAVA_HOME: " + javaHome);
  9.         System.out.println("User Name: " + userName);
  10.     }
  11. }
复制代码
如果运行环境变量设置了 JAVA_HOME=/usr/lib/jvm/java-11-openjdk,则输出:
  1. JAVA_HOME: /usr/lib/jvm/java-11-openjdk
  2. User Name: admin
复制代码

4. 结合 Spring Expression Language (SpEL)

@Value 注解支持 Spring 表达式语言(SpEL),可用于动态计算值。
(1)基本 SpEL 表达式

  1. @Component
  2. public class SpELExample {
  3.     @Value("#{2 * 5}")
  4.     private int result;
  5.     public void printResult() {
  6.         System.out.println("Result: " + result);
  7.     }
  8. }
复制代码
输出:
  1. Result: 10
复制代码
(2)引用 Bean 的属性

  1. @Component
  2. public class AnotherBean {
  3.     private String message = "Hello from AnotherBean
  4. ";
  5.     public String getMessage() {
  6.         return message;
  7.     }
  8. }
  9. @Component
  10. public class BeanReferenceExample {
  11.     @Autowired
  12.     private AnotherBean anotherBean;
  13.     @Value("#{anotherBean.message}")
  14.     private String messageFromAnotherBean;
  15.     public void printMessage() {
  16.         System.out.println(messageFromAnotherBean);
  17.     }
  18. }
复制代码
输出:
  1. Hello from AnotherBean
复制代码

5. 读取数组、聚集和 Map 范例数据

(1)读取数组

  1. app.servers=192.168.1.1,192.168.1.2,192.168.1.3
复制代码
  1. @Component
  2. public class ArrayConfig {
  3.     @Value("${app.servers}")
  4.     private String[] servers;
  5.     public void printServers() {
  6.         System.out.println(Arrays.toString(servers));
  7.     }
  8. }
复制代码
输出:
  1. [192.168.1.1, 192.168.1.2, 192.168.1.3]
复制代码
(2)读取 List

  1. @Component
  2. public class ListConfig {
  3.     @Value("#{'${app.servers}'.split(',')}")
  4.     private List<String> serverList;
  5.     public void printServerList() {
  6.         System.out.println(serverList);
  7.     }
  8. }
复制代码
输出:
  1. [192.168.1.1, 192.168.1.2, 192.168.1.3]
复制代码
(3)读取 Map

  1. app.db.config=username:admin,password:123456,url:jdbc:mysql://localhost:3306/test
复制代码
  1. @Component
  2. public class MapConfig {
  3.     @Value("#{${app.db.config}}")
  4.     private Map<String, String> dbConfig;
  5.     public void printDbConfig() {
  6.         System.out.println(dbConfig);
  7.     }
  8. }
复制代码
输出:
  1. {username=admin, password=123456, url=jdbc:mysql://localhost:3306/test}
复制代码

四、@Value 和 @ConfigurationProperties 对比

特性@Value@ConfigurationProperties作用范围实用于单个值注入实用于整个设置对象映射支持的数据范例主要用于 String、基本范例、数组可绑定复杂对象(如 List、Map、自定义对象)代码简洁性实用于少量设置参数实用于大量设置参数是否支持 SpEL支持不支持 示例:@ConfigurationProperties 用法
  1. app.name=Spring Boot Demo
  2. app.version=1.0.0
复制代码
  1. @Configuration
  2. @ConfigurationProperties(prefix = "app")
  3. public class AppProperties {
  4.     private String name;
  5.     private String version;
  6.     // getter & setter
  7. }
复制代码

五、总结



  • @Value 注解用于将设置文件中的值注入到 Spring 组件中。
  • @Value 可用于读取 application.properties 或 application.yml 中的值,并支持默认值。
  • @Value 还能用于读取环境变量、JVM 运行参数和 SpEL 表达式。
  • @Value 可以解析数组、List、Map 等数据布局。
  • 对于复杂设置推荐利用 @ConfigurationProperties,而 @Value 实用于简单值注入。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表