背景
一次在本地调试代码时,发现请求日志打印了两次,但是sql日志却只有一次,来到日志切面排查后去掉RefreshScope注解,问题解决
前言
xdm 本次只记录问题原因,不带大家看源码,感兴趣的请自行浏览
分析
在这之前需要先普及一个Spring bean作用域的小知识点,了解的可以跳过
Spring的bean作用域有四种取值
singleton(默认) 单例,一个容器只有一个,寿与天(IOC)齐,IOC不灭我不灭
prototype 生命周期=使用周期 用完即死
request 生命周期在一个请求内
session 生命周期在一个会话内
global session 不记得从什么时候开始已经删除掉了
还可以自定义作用域范围RefreshScope就是定义了refresh
我们在使用RefreshScope注解的时候,该注解会修改bean的作用域为自定义的refresh导致他不是单例的,这个时候如果再配置Spring其他的组件注解就会导致容器中有两个相同的bean(如果是切面 就会导致切面执行两次),RefreshScope动态刷新配置的原理也就在此,他开启了对象代理模式,我们引用的都是它的代理对象,当接收到属性更新事件时会先摧毁该bean然后重新走一次bean创建的过程来达到配置刷新的目的
所以,你学废了吗?