【发布时间】:2020-04-23 23:48:45
【问题描述】:
我最近正在使用 Spring Boot 和集成缓存。在我的测试中,我稍微使用了反射。
这是一个例子:
@Service
public class MyService {
private boolean fieldOfMyService = false;
public void printFieldOfMyService() {
System.out.println("fieldOfMyService:" + fieldOfMyService);
}
@Cacheable("noOpMethod")
public void noOpMethod() {
}
}
这就是测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { MyApplication.class })
public class MyServiceTest {
@Autowired
private MyService myService;
@Test
public void test() throws Exception {
myService.printFieldOfMyService();
boolean fieldOfMyService = (boolean) FieldUtils.readField(myService, "fieldOfMyService", true);
System.out.println("fieldOfMyService via reflection before change:" + fieldOfMyService);
FieldUtils.writeField(myService, "fieldOfMyService", true, true);
boolean fieldOfMyServiceAfter = (boolean) FieldUtils.readField(myService, "fieldOfMyService", true);
System.out.println("fieldOfMyService via reflection after change:" + fieldOfMyServiceAfter);
myService.printFieldOfMyService();
}
}
如您所见,这很简单:
-
MyService有一个私有字段fieldOfMyService - 测试通过反射将其从
false更改为true
问题
- 没有缓存一切正常。这是输出:
fieldOfMyService:false
fieldOfMyService via reflection before change:false
fieldOfMyService via reflection after change:true
fieldOfMyService:true
现在我通过以下方式激活缓存:
-
@EnableCaching春天 - 然后你会得到这个:
fieldOfMyService:false
fieldOfMyService via reflection before change:false
fieldOfMyService via reflection after change:true
fieldOfMyService:false <<<<< !!!
长话短说:
- 当缓存被激活时,服务似乎不受通过反射所做的更改的影响
有趣的是,这只发生在相应的服务通过至少一个 @Caching 注释方法实际使用缓存时。如果服务没有这样的:
@Service
public class MyService {
private boolean fieldOfMyService = false;
public void printFieldOfMyService() {
System.out.println("fieldOfMyService:" + fieldOfMyService);
}
}
.. 然后它仍然有效。
我猜这与激活缓存时添加的层有关。但为什么?有没有解决办法?
提前感谢您的帮助:-)
【问题讨论】:
-
您还需要澄清吗?
标签: java spring caching reflection