结论:

set方法不能被static修饰、不能被private修饰、不能被protect修饰,不能被abstract修饰,不能是Object和Class


理论依据:

1、springboot源码 JavaBeanBinder 文件下的 isCandidate方法

private boolean isCandidate(Method method) {
            int modifiers = method.getModifiers();
            return !Modifier.isPrivate(modifiers) && !Modifier.isProtected(modifiers) && !Modifier.isAbstract(modifiers) && !Modifier.isStatic(modifiers) && !method.isBridge() && !Object.class.equals(method.getDeclaringClass()) && !Class.class.equals(method.getDeclaringClass()) && method.getName().indexOf(36) == -1;
        }
  • 1.
  • 2.
  • 3.
  • 4.

2、static 修饰获取不到值的原因

  1. 在Spring框架中,@Value注解用于注入配置文件中的属性值到JavaBean中。但是,如果set方法被static修饰,那么这个方法就变成了类的方法,而不是对象的方法。Spring的依赖注入机制是通过反射来调用对象的setter方法,而不是类的方法。因此,当一个类的set方法被static修饰时,Spring无法通过反射找到对应的setter方法来注入值,从而导致无法获取到值。
  2. 非spring环境下,静态方法是属于类的,而不是属于任何特定的对象实例。当你尝试通过对象来调用一个静态方法时,实际上你是在直接调用类的方法,而不是通过对象实例来调用。这违反了面向对象编程的基本原则,即一切对象都应该通过其实例来进行操作
问题描述

通过get方法获取的属性值一致为null 

@Component
@ConfigurationProperties(prefix = "test")
public class Config
{
    /** 项目名称 */
    private static String name;

    public String getName()
    {
        return name;
    }

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

#application.yml配置

test:
   name: hello
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
解决方案

去掉static修饰词

public void setName(String name)
    {
        Config.name = name;
    }
  • 1.
  • 2.
  • 3.
  • 4.