实现步骤
- 新建 SpringConfig.class 作为 springMVC 的配置类,要注入 CacheManager,否则注解无法使用
@Configuration
@EnableWebMvc
@EnableCaching // 打开缓存驱动
@ComponentScan(basePackages = "com.ibm.redis")
public class SpringConfig extends WebMvcConfigurationSupport {
// 定义 CacheManager,该方法必需
@
Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("myCache")));
/*cacheManager.setCaches(Arrays.asList (
// 新建2个缓存实例
new ConcurrentMapCache[] {
new ConcurrentMapCache("default"),
new ConcurrentMapCache("test"),
new ConcurrentMapCache("users")}));*/
return cacheManager;
}
// 定义 key 的生成策略,该方法非必需
@Bean
public KeyGenerator keyGenerator() {
return new MyKeyGenerator();
}
}
注意
-
cacheManager 方法中可以添加多个缓存实例,缓存实例将会在后面用到
-
MyKeyGenerator 类的实现
// 缓存键的生成策略
public class MyKeyGenerator implements KeyGenerator {
public Object generate(Object target, Method method, Object ... params) {
return target.getClass().getName() + method.getName();
}
}
- 新建 RedisServer.class 用于测试
@Service
public class RedisServer {
@Cacheable(cacheNames = "myCache", key = "targetClass")
public String get1() {
System.out.println(new Date() + "--> No value from cache");
return "Ramos";
}
@Cacheable(cacheNames = "myCache", key = "targetClass")
public User get2() {
System.out.println(new Date() + "--> No value from cache");
return new User(1, "dufu");
}
}
注意:@Cacheable 标签中的 cacheNames 属性的值 myCache 就是我们在 SpringConfig.class 中添加的缓存实例的属性值,一定要对应上,否则会报错
- 当然对于一个类中,如果 @Cacheable 标签中的 cacheNames 属性一致的话,我们同样可以使用@CacheConfig 来减少代码量,修改后的 RedisServer.class 如下
@Service
@CacheConfig(cacheNames = "myCache", keyGenerator = "keyGenerator")
public class RedisServer {
@Resource
private CacheManager cacheManager;
@Cacheable
public String get1() {
System.out.println(new Date() + "--> No value from cache");
return "Ramos";
}
@Cacheable
public User get2() {
System.out.println(new Date() + "--> No value from cache");
return new User(1, "dufu");
}
}
- 当我们在测试的时候发现,调用 get2() 方法的时候会报错,提示对于 User.class 没有转换器
当出现这种情况我们应该提供一个 JSON 格式的转换来处理实体类,解决方法也十分简单,只需要在 pom.xml 中添加 jackson 的依赖即可
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>