首先排除版本问题。
如果在controller类上面直接加@RefreshScope注解,会导致name值为null,count值也为null。
@Slf4j
@RestController
@RequestMapping("api")
@RefreshScope(proxyMode = )
public class HelloController {
private AtomicInteger count = new AtomicInteger(0);
@Value("${}")
String name;
@GetMapping("hi")
private String sayHi() {
("{} 第{}次进来了.", (), (1));
return "hi springboot addmin " + ()+" name===="+name;
}
}
这是因为:
这个注解的proxyMode默认值是ScopedProxyMode.TARGET_CLASS,这个代理模式使用的是CGLIB方式。如果@RefreshScope使用在@Controller(不止这一个)标记的类上就会出现注入null值的问题。@RefreshScope只要是用在其他会被spring使用CGLIB代理的类上就会出问题。原因是@RefreshScope默认使用CGLIB代理,而目标类又是被CGLIB代理过的,这样就被代理了两次,第二次也就是@RefreshScope代理的时候会出现属性丢失的问题。(出处:http:///index/article/)
解决办法:
第一种(推荐):
新建实体类,将所有需要动态刷新的值都放入这个实体类,将@RefreshScope注解放在这个实体类上面,其他地方调用该类的get方法获取值。
第二种:
修改为@RefreshScope(proxyMode = )模式,不建议这样用,因为使用RefreshScope刷新时会注销该实例重新生成,这样会导致全局变量中存储的某些内容会丢失,例如上面代码中count值自动刷新后会重新归零。