Spring IoC注入一些简单的值的几种常见方法

 更新时间:2025年07月10日 10:53:14   作者:冰糖心书房  
这篇文章主要介绍了Spring IoC注入一些简单的值的几种常见方法:属性占位符(从配置文件获取值,高灵活性)、SpEL表达式(动态计算,极高灵活性)及硬编码值(固定字符串,低灵活性),体现控制反转思想,提升应用配置管理的灵活性与可维护性,需要的朋友可以参考下

我们来梳理一下最常见的几种用法:

方法一:注入配置文件中的属性(最常用)

这是最核心的用法。假设我们有一个标准的 Spring Boot 项目,其配置文件 application.properties 内容如下:

src/main/resources/application.properties

# 应用信息
app.name=My Awesome App
app.version=1.2

# 作者信息
author.name=Alice
author.email=alice@example.com

# 功能开关和配置
feature.email.enabled=true
max.pool.size=100

现在,我们想创建一个 AppInfoService 组件,并将这些配置值注入进去。

AppInfoService.java

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class AppInfoService {

    // 1. 注入字符串
    @Value("${app.name}")
    private String appName;

    // 2. 注入数字(Spring会自动进行类型转换)
    @Value("${app.version}")
    private double appVersion;

    @Value("${max.pool.size}")
    private int maxPoolSize;

    // 3. 注入布尔值
    @Value("${feature.email.enabled}")
    private boolean isEmailEnabled;

    // 4. 提供默认值
    // 如果配置文件中没有 `app.description`,则使用默认值 "A great application"
    @Value("${app.description:A great application}")
    private String appDescription;

    public void displayAppInfo() {
        System.out.println("Application Name: " + appName);
        System.out.println("Application Version: " + appVersion);
        System.out.println("Max Pool Size: " + maxPoolSize);
        System.out.println("Is Email Feature Enabled: " + isEmailEnabled);
        System.out.println("Description: " + appDescription);
    }
}

关键点解读:

  • 语法 \${...}:这是属性占位符 (Property Placeholder)。它告诉 Spring:“请到我的环境配置(包括 application.properties、系统变量、JVM参数等)中去查找 ... 这个键,并把它的值注入进来。”
  • 自动类型转换:你只需要定义好字段的类型(double, int, boolean),Spring 的类型转换服务会自动将配置文件中的字符串值(如 "1.2")转换成相应的 Java 类型。
  • 提供默认值 :${...}:使用冒号 : 可以在属性不存在时提供一个默认值。这可以防止因为缺少某个可选配置而导致应用启动失败。

方法二:使用 Spring 表达式语言 (SpEL)

@Value 不仅能注入属性,还能执行更强大的 Spring Expression Language (SpEL) 表达式。SpEL 表达式使用 #{...} 语法。

SpEL 可以让你:

  • 引用其他 Bean 的属性。
  • 执行方法调用。
  • 进行数学运算。
  • 引用系统属性等。

一些例子:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class SpelExamples {

    // 1. 执行简单的数学运算
    @Value("#{10 * 60}") // 注入 600
    private int secondsInTenMinutes;

    // 2. 引用另一个Bean的属性
    // 假设容器中有一个名为 appInfoService 的Bean
    @Value("#{appInfoService.appName}") 
    private String anotherAppName;

    // 3. 调用静态方法
    @Value("#{T(java.lang.Math).random() * 100.0}")
    private double randomNumber;

    // 4. 引用系统属性
    @Value("#{systemProperties['user.home']}")
    private String userHomeDirectory;

    // 5. 结合属性占位符使用
    // 先从配置文件找到 `some.value`,如果不存在则使用 `default`,然后转为大写
    @Value("#{'${some.value:default}'.toUpperCase()}")
    private String uppercaseValue;

    public void display() {
        System.out.println("Seconds in 10 minutes: " + secondsInTenMinutes);
        System.out.println("Copied App Name: " + anotherAppName);
        System.out.println("Random Number: " + randomNumber);
        System.out.println("User Home: " + userHomeDirectory);
        System.out.println("Uppercase Value: " + uppercaseValue);
    }
}

\${...} vs #{...} 的区别
这也是个常见的面试题:

  • \${...}属性占位符,主要用于从外部配置文件中获取值。它是静态的,值在应用启动时就基本确定了。
  • #{...}SpEL 表达式,用于执行动态的计算和逻辑。它可以在运行时计算出一个值。

方法三:注入硬编码的字符串

虽然不常用,但你也可以直接注入一个写死的字符串。

@Value("This is a hardcoded message")
private String message;

这种方式的灵活性很低,通常只在测试或非常简单的场景下使用。

总结

注入方式语法数据来源主要用途灵活性
属性占位符@Value("${...}")配置文件、环境变量等将外部配置注入代码,实现代码与配置解耦。非常高
SpEL 表达式@Value("#{...}")Bean 属性、方法调用、运算结果执行动态计算,实现更复杂的注入逻辑。极高
硬编码值@Value("...")固定的字符串测试或注入不会改变的常量。非常低

通过 @Value 注解,Spring IoC 容器不仅能管理对象之间的依赖关系(@Autowired),还能完美地管理对象与外部配置值之间的关系,从而让我们的应用程序更加健壮、灵活和易于维护。这同样是控制反转思想的体现:组件不再自己去读取配置文件,而是被动地等待容器将配置值“注入”给它。

以上就是Spring IoC注入一些简单的值的几种常见方法的详细内容,更多关于Spring IoC注入值的资料请关注脚本之家其它相关文章!

相关文章

  • Java springboot 整合 Nacos的实例代码

    Java springboot 整合 Nacos的实例代码

    这篇文章主要介绍了Java springboot 整合 Nacos的实例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • jdk自带定时器使用方法详解

    jdk自带定时器使用方法详解

    这篇文章主要为大家详细介绍了jdk自带定时器的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • SpringBoot整合XXLJob的实现示例

    SpringBoot整合XXLJob的实现示例

    XXLJob是大众点评开源的分布式任务调度平台,支持Cron、固定间隔等触发方式,本文主要介绍了SpringBoot整合XXLJob的实现示例,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • springMVC @RestControllerAdvice注解使用方式

    springMVC @RestControllerAdvice注解使用方式

    这篇文章主要介绍了springMVC @RestControllerAdvice注解使用方式,下面通过一个简单的示例,演示如何使用 @RestControllerAdvice,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • MyBatis-Plus通过插件将数据库表生成Entiry,Mapper.xml,Mapper.class的方式

    MyBatis-Plus通过插件将数据库表生成Entiry,Mapper.xml,Mapper.class的方式

    今天小编就为大家分享一篇关于MyBatis-Plus通过插件将数据库表生成Entiry,Mapper.xml,Mapper.class的方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • SpringBoot2新特性 自定义端点详解

    SpringBoot2新特性 自定义端点详解

    这篇文章主要介绍了SpringBoot2新特性 自定义端点详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java 实战项目锤炼之在线购书商城系统的实现流程

    Java 实战项目锤炼之在线购书商城系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+jsp+mysql+servlet+ajax实现一个在线购书商城系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java使用JDBC实现Oracle用户认证的方法详解

    Java使用JDBC实现Oracle用户认证的方法详解

    这篇文章主要介绍了Java使用JDBC实现Oracle用户认证的方法,结合实例形式分析了java使用jdbc实现数据库连接、建表、添加用户、用户认证等操作流程与相关注意事项,需要的朋友可以参考下
    2017-08-08
  • Java如何实现支付宝电脑支付基于servlet版本

    Java如何实现支付宝电脑支付基于servlet版本

    这篇文章主要介绍了Java如何实现支付宝电脑支付基于servlet版本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 详解SpringBoot健康检查的实现原理

    详解SpringBoot健康检查的实现原理

    这篇文章主要介绍了详解SpringBoot健康检查的实现原理,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-03-03

最新评论