@RefreshScope引起的取值为null

2022-12-29  本文已影响0人  伊夫_艾尔斯

网上找了一堆介绍,越说越糊涂,后面自己测试后明白了.

先上代码

@RefreshScope
@Configuration
public class ScopeTestConfig {

    @Value("config.test.one")
    public String one;

    @Value("config.test.two")
    private String two;

    public String getOne() {
        return one;
    }

    public String getTwo() {
        return two;
    }
}
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "config.test")
public class ScopeTestConfig1 {

    public String one;

    private String two;

    public String getOne() {
        return one;
    }

    public String getTwo() {
        return two;
    }

}
    @Autowired
    ScopeTestConfig config;

    void test(){
        String fieldVal1 = config.one;
    }

    @Autowired
    ScopeTestConfig config;

    void test(){
        String getMethod1 = config.getOne();
        String getMethod2 = config.getTwo();
    }

取值方式 无@RefreshScope 有@RefreshScope
方式1(field取值) 有值 null
方式2(方法取值) 有值 有值

@RefreshScope 会使注入的值放到代理类中,
而当前bean的属性字段是没有值的,直接读取bean的field会为null,
只有通过方法(不一定是get方法)才会触发去代理类中取值.

很多遇到在@Controller中直接@Value获取不到值,解决方法是定义另外一个配置类,再取值就可以了,其实忽略了取值的方式, 都是代理惹的祸.

上一篇下一篇

猜你喜欢

热点阅读