Which implementation is needed based on the cache name?
Not based on the cache name, but yes - based on the CacheManager it is possible. Declare one of them as @Primary CacheManager
, as follows:
@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;
}
}
and specify it at class level as:
@Service
@CacheConfig(cacheManager="hazelcastCacheManager")
public class EmployeeServiceImpl implements IEmployeeService {
}
or at method level as:
@Service
public class EmployeeServiceImpl implements IEmployeeService {
@Override
@Cacheable(value = "EMPLOYEE_", key = "#id", cacheManager= "guavaCacheManager")
public Employee getEmployee(int id) {
return new Employee(id, "A");
}
}
If you have to stick with Cache name only, then you can multiple CacheManager.
CompositeCacheManager
it should be possible, but you will possibly have to disabled Boot's autoconfiguration (I am not that familiar with Boot).