@Value取不到值原因

现象

@Value取不到配置文件中的值

原因

以下四种情况都会造成这种现象。

1. 在Bean初始化时构造方法中引用被@Value修饰的变量

  • 由于spring实例化顺序为先执行构造方法,再注入成员变量,所以如果在构造函数里面调用注入的成员变量是获取不到的。
  • 解决办法为:再写一个常量类,在常量类中引用@value,再在构造方法中引用常量类的变量即可。
@Component
public class TestValue {
    @Value("${kafka.bootstrap.servers}")
    private String kafkaServers;
 
    public TestValue(){
        System.out.println(kafkaServers);
    }
}
这种情况打印出来的就是null

2. 使用static或final修饰

变量被关键字static或者final修饰

@Value("${tag}")
private static String tagValue;  //错误,打印出来为null

@Value("${tag}")
private final String tagValue;    //错误,打印出来为null

3. 类没有使用@Component及其衍生标签修饰

因为@Value是在AbstractAutowireCapableBeanFactory类的doCreateBean方法中进行初始化,即交由Spring容器进行处理,如果没有@Component及其衍生注解注释Spring无法识别,导致无法获取到配置值。

4. 类被new新建了实例,而没有使用@Autowired

使用@Value的类,在spring中,不能直接通过new 操作符来使用,而是应该通过spring的注解 @Autowired 来使用,

@Component 
class TestValue{
    @Value("${tag}")
    private String tagValue;
}

class Test{
    //这种new新建的实例,testValue1.tagValue值为null获取不到
    TestValue testValue1. = new TestValue() 
    
    //自动注入的可以获取到
    @Autowired
  	TestValue testValue2;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×