Spring Boot的ConfigurationProperties或Value注解无效

在SpringBoot项目中,使用@ConfigurationProperties结合@Component实现全局配置读取时,若属性为静态(static),Spring注入将失效。文章解析了问题原因,并提供了解决方案:去除Set方法的static修饰符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一个问题

俗话说,越低级的错误越让我们歇斯底里。 ----沃兹基硕德

在一般的SpringBoot项目开发中,我们一般会创建一些全局的静态配置类,用来读取application.yml/application.properties配置文件的内容。
普遍的做法是利用@Component和@ConfigurationProperties(prefix = “XXX”)这两个注解来帮我们实现。

# 项目相关配置
cadre:
  # 名称
  name: cadreuc
package com.cadre.common.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 全局配置类
 *
 * @author cadre
 */
@Component
@ConfigurationProperties(prefix = "cadreman")
public class Global
{
    /** 项目名称 */
    private static String name;

    public static String getName()
    {
        return name;
    }

    public static void setName(String name)
    {
        Global.name = name;
    }
}

原理非常简单,利用Spring将属性注入到静态类,然后通过静态类的特性使我们可以在项目全局取到它的值。
但是,当我们照猫画虎的创建了一个静态类后,却发现我们取的值始终为null。
难道是Component注解失效了吗?并不是,我们创建一个同名的Bean后提示命名重复。
难道是ConfigurationProperties注解失效了吗?带着疑问,我们继续研究。

发现问题所在

作为一名资深的CV程序员,已经多年没有手打过Get/Set方法了。
然而问题就在这里。当我们创建了一个静态属性时,IDE帮我们生成的Get/Set方法都默认加上了static。


	/** 项目名称 */
    private static String name;

	public static String getName()
    {
        return name;
    }

    public static void setName(String name)
    {
        Global.name = name;
    }
    

而Spring在注入这些属性时,反射的Set方法不会对static方法起作用。所以导致了我们的set方法没有被调用。

解决方法

去掉Set方法的static

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值