t.println("say something!");
}
}
CacheManager
有两个方法需要被实现:
getCache(String)
- 获取缓存存取器。这里的name
其实就对应了@Cacheable
注解中的value
与cacheName
参数。
getCacheNames
- 获取类中所有缓存的名称集合。这主要是为了Spring
内部的统一管理需要。
因为 Spring采用了默认替补策略,所以我们使用@Component
或是通过@Bean
自动注入后,默认的缓存管理器就会切换成我们自定义的。如果我们自定义了两个的话,可以通过@Primary
来设定默认管理器。
Cache
缓存存取器,用来管理缓存键值对的基本单元。
为了能对不同的缓存采用不同的存取策略,我们可以定制不同的Cache
,并通过自定义的CacheManager
的getCache
方法返回对应的Cache
。
举个例子:
public final static class MyCache extends ConcurrentMapCache {
public MyCache(String name) {
super(name);
}
@Override
public <T> T get(Object key, Class<T> type) {
System.out.println("正在读取 - " + key);
return super.get(key, type);
}
@Override
public <T> T get(Object key, Callable<T> valueLoader) {
System.out.println("正在读取 - " + key);
return super.get(key, valueLoader);
}
@Override
public ValueWrapper get(Object key) {
System.out.println("正在读取 - " + key);
return super.get(key);
}
}
这里的MyCache
集成了ConcurrentMapCache
,并对每次缓存值的获取都进行了控制台输出。
KeyGenerator
缓存key生成器,用于自定义规则缓存key的生成。
其接口的方法只有一个:
public interface KeyGenerator {
Object generate(Object target, Method method, Object... params);
}
一目了然,通过调用的目标对象、目标方法与方法入参进行key的生成。这里不做过多赘述。
不过需要注意的是,由于不同类可能有同名同参数的方法,这里建议加上target.getClass().getName()
来作为标记,避免出现不希望的缓存映射。