Могу ли я переопределить @Cacheable KeyGenerator для данного класса только в Spring 4?

Я пытаюсь переопределить KeyGenerator для всего класса, но не знаю, есть ли простой способ сделать это.

У меня есть следующая настройка bean-компонента конфигурации для включения моего кеша:

@Configuration
@EnableCaching(mode=AdviceMode.ASPECTJ)
public class CacheConfig extends CachingConfigurerSupport{
    @Bean(destroyMethod="shutdown")
    public net.sf.ehcache.CacheManager ehCacheManager() {
        CacheConfiguration configCache = new CacheConfiguration();
        veracodeCache.setName("repo");
        net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
        config.addCache(configCache);
        return net.sf.ehcache.CacheManager.newInstance(config);
    }

    @Bean
    @Override
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheManager());
    }

    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return new SimpleKeyGenerator();
    }
}

Однако в конкретном классе я хотел бы использовать другой генератор ключей. Я знаю, что могу переопределить отдельный генератор ключей в каждом вызове @Cacheable, но не смог найти способ переопределить его для класса в целом.

ex:

@KeyGenerator("com.domain.MyCustomKeyGenerator")  // <--- anyway to set a different key gen for the entire class?
public class Repo{

   @Cacheable("repo")
   public String getName(int id){
       return "" + id;
   }
}

Согласно документам, если я установлю @Cacheable для типа, все методы будут кэшированы (это не то, что я ищу).

Мой другой вариант, конечно, - указать @Cacheable(value="repo", keyGenerator="com.domain.MyCustomKeyGenerator") для каждого метода, но это очень избыточно, особенно если я хочу изменить генератор ключей по умолчанию для нескольких классов.

Есть ли поддержка для этого?


person Eric B.    schedule 14.10.2015    source источник


Ответы (1)


Вы можете использовать @CacheConfig на уровне класса. Он не включает кеш для методов, он просто настраивает его.

@CacheConfig(keyGenerator="com.domain.MyCustomKeyGenerator") 
public class Repo{

   // your com.domain.MyCustomKeyGenerator will be used here
   @Cacheable("repo")
   public String getName(int id){
       return "" + id;
   }
}
person Ruben    schedule 29.10.2015