@PropertySource&@ImportResource&@Bean

一、核心定义与基础用法

1. @Value 注解

@Value 是 Spring 中用于零散地、直接地注入单个配置值的注解,支持 SpEL 表达式(Spring 表达式语言),通常作用在字段、方法参数或构造器参数上。

java

运行

复制代码
@Component
public class ValueDemo {
    // 注入单个配置值
    @Value("${app.name}")
    private String appName;

    // 支持默认值
    @Value("${app.port:8080}")
    private Integer appPort;

    // 支持SpEL表达式
    @Value("#{T(java.lang.Math).random() * 100}")
    private Double randomNum;
}
2. @ConfigurationProperties 注解

@ConfigurationProperties 是 Spring Boot 提供的注解,用于批量地、结构化地 绑定一组相关的配置属性到一个 Java 类中,通常作用在类上,需要配合 @Component(或 @Configuration)使类被 Spring 管理。

java

运行

复制代码
@Component
// 绑定配置前缀为app的所有属性
@ConfigurationProperties(prefix = "app")
public class ConfigPropertiesDemo {
    private String name;
    private Integer port;
    private List<String> allowedIps; // 支持复杂类型(集合、对象)

    // 必须提供getter/setter方法(核心!)
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public Integer getPort() { return port; }
    public void setPort(Integer port) { this.port = port; }
    public List<String> getAllowedIps() { return allowedIps; }
    public void setAllowedIps(List<String> allowedIps) { this.allowedIps = allowedIps; }
}

对应的 application.yml 配置:

yaml

复制代码
app:
  name: demo-app
  port: 8081
  allowed-ips: [127.0.0.1, 192.168.1.1]

二、核心对比(笔记核心)

对比维度 @Value 注解 @ConfigurationProperties 注解
绑定方式 单个属性零散绑定 批量结构化绑定(按前缀分组)
支持的数据类型 基本类型、String、SpEL 表达式 基本类型、String、集合、对象(嵌套)
是否需要 getter/setter 不需要(直接注入字段) 必须需要(通过 setter 绑定)
默认值支持 支持(如 ${key:默认值}) 不直接支持(需在类中手动设置默认值)
SpEL 表达式支持 支持 不支持
配置校验 不支持(无法用 @Validated 等校验) 支持(配合 @Validated、@NotNull 等)
松散绑定 不支持(必须严格匹配配置名,如 appName 不能写 app-name) 支持(app-name 可绑定到 appName 字段)
IDE 提示 无(IDE 无法识别配置键是否存在) 有(Spring Boot 插件可提示配置键)
使用场景 少量、零散的配置注入 一组相关的配置(如数据源、第三方服务配置)

三、实战示例:配置校验(@ConfigurationProperties 独有)

java

运行

复制代码
@Component
@ConfigurationProperties(prefix = "app")
@Validated // 开启校验
public class ValidConfigDemo {
    @NotNull(message = "应用名称不能为空") // 校验规则
    private String name;

    @Min(value = 1024, message = "端口号不能小于1024")
    private Integer port;

    // getter/setter省略
}

当配置中 app.name 为空时,启动项目会直接抛出校验异常,提前发现配置错误,这是 @Value 做不到的。

四、使用建议

  1. 如果只是注入 1-2 个零散的配置(如单个端口、单个开关),用 @Value 更简洁;
  2. 如果是一组相关的配置(如数据库配置:url、username、password),优先用 @ConfigurationProperties,可读性和可维护性更高;
  3. 对配置有校验需求、需要 IDE 提示、或配置包含集合 / 对象类型时,必须用 @ConfigurationProperties;
  4. 避免混合使用:同一组配置要么全用 @Value,要么全用 @ConfigurationProperties,保持风格统一。

总结

  1. @Value 适合零散、简单、需 SpEL 的配置注入,无需 getter/setter,但不支持校验和松散绑定;
  2. @ConfigurationProperties 适合批量、结构化、需校验 的配置注入,支持复杂类型和松散绑定,是 Spring Boot 中管理配置的最佳实践;
  3. 核心选择依据:配置的 "关联性" 和 "复杂度"------ 零散简单用@Value,成组复杂用@ConfigurationProperties。
相关推荐
云-缩影2 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
AI开源软件4 小时前
SpringBoot3+Vue3 财务管理系统如何设计:从业务单据到总账的模块划分
spring boot·vue3·领域建模·会计凭证·ruoyi office·业财协同·财务系统设计
Mikko79 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
计算机毕设定制辅导-无忧学长14 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
vipxieliang15 小时前
ValidX 正则表达式预编译优化:Pattern 复用策略
java·spring boot·后端
余槐i17 小时前
Spring Boot 3.2 偶发500无日志:线程池复用导致请求上下文丢失
spring boot·redis·后端·mysql·性能优化
杨凯凡17 小时前
Spring Boot 的 @Transactional 为什么会失效?从代理、自调用到异常回滚的排查实战
java·spring boot·spring·事务·后端开发
云创智城-yuncitys1 天前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot
paopaokaka_luck1 天前
灾害应急物资管理系统(AI应急助手、Echarts可视化数据看板、捐赠入库联动、 物资全流程管理、库存变动追溯、灾情资讯与互动反馈、物资发放公示)
java·前端·javascript·spring boot·mysql·tomcat·echarts
学长毕设1 天前
基于SpringBoot的网上流浪狗救助捐赠平台-附源码
java·spring boot·后端