我正在使用Spring Boot和EhCache开发日历应用程序.
我正在尝试缓存以下方法:
@Override
@Cacheable(value = "concerts")
public List<Event> getEvents(String eventsForUser, Date startDate, Date endDate) throws Exception {
return fetchEventsFromTheServer(eventsForUser, startDate, endDate);
}
挑战是我想操纵返回的缓存结果.例如,检查是否存在给定日期的缓存,但是对于不同的用户,然后返回它(只要两个用户都满足特定条件).
所以,在返回结果之前,我想:
>获取所有缓存条目的列表
>遍历所有这些并检查所需的日期/用户
>如果发现合适 – 返回
>如果未找到 – 缓存不可用,请运行该方法.
我认为最好的方法是创建一个自定义缓存管理器,它将使用缓存的Concert进行所有操作,并为所有其他方法使用默认的自动配置缓存,但我无法让我的自定义管理器工作,并且没有找到任何好处有关如何实现自定义CacheManager的示例.
这是我有的:
Application.java:
@SpringBootApplication
@ComponentScan
@EnableCaching
@EnableScheduling
public class SpringBootWebApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootWebApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(applicationClass);
}
private static Class<SpringBootWebApplication> applicationClass = SpringBootWebApplication.class;
@Bean(name = "eventsCacheManager")
public EventsCacheManager eventsCacheManager() {
return new EventsCacheManager();
}
@Primary
@Bean(name = "cacheManager")
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
cmfb.setShared(true);
return cmfb;
}
}
EventsCacheManager.java
@Component
public class EventsCacheManager implements CacheManager {
@Override
public Cache getCache(String s) {
return null;
}
@Override
public Collection<String> getCacheNames() {
return null;
}
}
EventsCacheManager.java – 如何实现它?
@Component
public class EventsCacheManager implements CacheManager {
@Override
public Cache getCache(String s) {
return null;
}
@Override
public Collection<String> getCacheNames() {
return null;
}
}
如果有人能给我一个关于如何实现我的自定义CacheManager的例子,我将非常感激
解决方法:
我并没有花太多时间考虑你的需求/用例,但我认为自定义CacheManager在这种情况下会起作用,假设“自定义”CacheManager逻辑是正确的.
因此,默认情况下,Spring在上下文中查找名为“cacheManager”的bean,并将其用于所有缓存操作.在您的配置中,您明确定义了2个“CacheManagers”…
@Bean(name = "eventsCacheManager")
public EventsCacheManager eventsCacheManager() {
return new EventsCacheManager();
}
@Primary
@Bean(name = "cacheManager")
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
即“eventsCacheManager”(自定义)和“cacheManager”(标准).实际上,您甚至将“cacheManager”标记为主要(使用@Primary注释).当然,如果你没有这样做,Spring肯定会抱怨,因为在执行自动连线时(默认为按类型自动连接),在上下文中找到了超过1个给定类型的bean(即CacheManager).
因此,为了调用哪个缓存管理策略(即CacheManager)在运行时使用特定的服务调用,您还需要告诉Spring使用哪个CacheManager(也就是策略),就像这样……
@Override
@Cacheable(value = "concerts", cacheManager="eventsCacheManager")
public List<Event> getEvents(String eventsForUser, Date startDate, Date endDate) throws Exception {
return fetchEventsFromTheServer(eventsForUser, startDate, endDate);
}
即使用@Cacheable注释中的cacheManager属性来指示要使用的缓存策略.
有关详细信息,请参阅Custom cache resolution上的Spring的参考文档.
希望这有助于您前进.