java – Spring Cache – 创建自定义CacheManager

我正在使用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的参考文档.

希望这有助于您前进.

上一篇:java – EhCache:为什么我的diskStore路径目录没有创建?


下一篇:java – 如何刷新二级缓存?