【发布时间】:2012-07-01 00:36:45
【问题描述】:
是否可以配置 Spring @Cacheable,以便如果缓存未命中,对可缓存方法的调用会被阻塞,直到可缓存方法执行一次并填充缓存?
在我的情况下,我正在处理数据库中不经常更改的数据,实际上如果这些数据发生更改,则需要重新启动应用程序。我可以创建@PostConstruct 方法并在每个服务启动时初始化数据,但这似乎不像@Cacheable 注释那样“优雅”。
我打算将 EhCache 与 Spring @Cacheable 注释一起使用。
更新:
以下是我在尝试使用@PostConstruct 时遇到的一些问题,以防其他人遇到这些问题。 @PostConstruct 方法不能是 @Transactional,因为它们在设置对象的属性之后运行,而不是在配置整个 spring 上下文之后运行。因此,您不能假设在调用 @PostConstruct 方法时,TX 管理器已全部设置和配置。解决方法是实现 ApplicationListener 并手动注入 TransactionTemplate ......等等通过使用 @Cacheable 简化了很多额外的工作。
【问题讨论】:
-
我添加了一个 ApplicationListener 并将其配置为侦听 ContextRefreshedEvent,但是在生命周期中此时执行我的方法仍然为时过早,无法缓存在我的方法上。您能否详细说明您还需要做什么?