我最近在使用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
我现在通过以下方式激活缓存:
- 在Spring中使用
@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);
}
}
......那它仍然可以工作。
我猜这与启用缓存时添加的层有关。但是为什么呢?是否有解决办法?
先感谢您的帮助 :-)