Выясните, что кеширование не работает для меня, потому что методы с аннотациями @Cacheable находятся внутри классов с такой структурой.У меня есть
public interface Filter<T> {
List<T> filter(int limit);
}
и куча реализаций:
@Component
public class UpcomingFilter implements Filter<Entity> {
@Cacheable(value = {"upcoming"})
@Override
public List<Entity> filter(int limit) {
//retrieve from repository
}
}
@Component
public class RecentlyAddedFilter implements Filter<Entity> {
@Cacheable(value = {"recentlyAdded"})
@Override
public List<Entity> filter(int limit) {
//retrieve from repository
}
}
//and 6 more implementations
Для оптимизации автопроводки этих фильтров я использую HashMap, где я храню эти фильтры:
@EnableAspectJAutoProxy
@ComponentScan
@Configuration
public class AppConfig {
@Bean("filtersMap")
public Map<String, Filter> filters() {
Map<String, Filter> filtersMap = new HashMap<>();
filtersMap.put("upcomingFilter", new UpcomingFilter(sessionRepository));
filtersMap.put("recentlyAddedFilter", new RecentlyAddedFilter(entityRepository));
//..another filters
return filtersMap;
}
}
И эту карту я автоматически подключаю в своем слое обслуживания:
@Qualifier("filtersMap") Map<String, Filter> filterMap
Конфигурация кэша:
@EnableCaching
@Configuration
public class CacheConfiguration {
@Bean
public CacheManager cacheManager() {
String[] cacheNames = new String[] {"upcoming", "recentlyAdded"};
return new ConcurrentMapCacheManager(cacheNames);
}
}
И я выполняю sysout в каждом методе фильтрации и измеряю время выполнения.Это показывает, что кешируемые методы вызываются каждый раз, а кеш не используется.Затем я создаю простой класс MyFilter без реализации интерфейса Filter , аннотирую его метод с помощью @ Cacheable , и он работает как чудо.Итак, как решить эту проблему, что кеш не работает для классов, которые реализуют Filter interface