nacos动态更新配置RefreshScope注解后取值为null

首先排除版本问题。

如果在controller类上面直接加@RefreshScope注解,会导致name值为null,count值也为null。

@Slf4j
@RestController
@RequestMapping("api")
@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
public class HelloController {
    private AtomicInteger count = new AtomicInteger(0);

    @Value("${spring.name}")
    String name;

    @GetMapping("hi")
    private String sayHi() {
        log.info("{} 第{}次进来了.", LocalDateTime.now(),  count.addAndGet(1));
        return "hi springboot addmin " + LocalDateTime.now()+"  name===="+name;
    }
}

这是因为:

这个注解的proxyMode默认值是ScopedProxyMode.TARGET_CLASS,这个代理模式使用的是CGLIB方式。如果@RefreshScope使用在@Controller(不止这一个)标记的类上就会出现注入null值的问题。@RefreshScope只要是用在其他会被spring使用CGLIB代理的类上就会出问题。原因是@RefreshScope默认使用CGLIB代理,而目标类又是被CGLIB代理过的,这样就被代理了两次,第二次也就是@RefreshScope代理的时候会出现属性丢失的问题。(出处:http://www.ifx666.cn/index/article/fb7361aa4d134b0ea8c7621641a4f06b.html

解决办法:

第一种(推荐):

新建实体类,将所有需要动态刷新的值都放入这个实体类,将@RefreshScope注解放在这个实体类上面,其他地方调用该类的get方法获取值。

第二种:

修改为@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)模式,不建议这样用,因为使用RefreshScope刷新时会注销该实例重新生成,这样会导致全局变量中存储的某些内容会丢失,例如上面代码中count值自动刷新后会重新归零。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值