Solución:
¿Qué implementación se necesita según el nombre de la caché?
No se basa en el nombre de la caché, pero sí, en función del CacheManager es posible. Declare uno de ellos como @Primary CacheManager
, como sigue:
@Configuration
@EnableCaching
@PropertySource(value = { "classpath:/cache.properties" })
public class CacheConfig {
@Bean
@Primary
public CacheManager hazelcastCacheManager() {
ClientConfig config = new ClientConfig();
HazelcastInstance client = HazelcastClient.newHazelcastClient(config);
return new HazelcastCacheManager(client);
}
@Bean
public CacheManager guavaCacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager("mycache");
CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterWrite(10, TimeUnit.MINUTES);
cacheManager.setCacheBuilder(cacheBuilder);
return cacheManager;
}
}
y especificarlo a nivel de clase como:
@Service
@CacheConfig(cacheManager="hazelcastCacheManager")
public class EmployeeServiceImpl implements IEmployeeService {
}
o a nivel de método como:
@Service
public class EmployeeServiceImpl implements IEmployeeService {
@Override
@Cacheable(value = "EMPLOYEE_", key = "#id", cacheManager= "guavaCacheManager")
public Employee getEmployee(int id) {
return new Employee(id, "A");
}
}
Si tiene que ceñirse solo al nombre de Cache, entonces puede usar CacheManager.
Tienes 2 opciones.
Uno es como mencionó @Arpit: Defina múltiples CacheManagers y especifíquelos en anotaciones a nivel de método (@Cacheable, @CachePut, etc.) o anotaciones a nivel de clase (@CacheConfig)
También puede crear anotaciones personalizadas:
@CacheConfig(cacheManager = "guavaCacheManager")
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface GuavaCacheable {
}
@GuavaCacheable
@Service
public class MyServiceImpl implements MyService {
}
Y como segunda opción, puede crear un solucionador de caché personalizado si sus necesidades de almacenamiento en caché son complejas.
Puede buscar aquí un CacheResolver personalizado que administre múltiples CacheManagers y admita habilitar / deshabilitar. Pero para la mayoría de los casos, CacheResolver es excesivo.