SpringMVC使用缓存

实现步骤

  1. 新建 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();
    }
}

注意

  1. cacheManager 方法中可以添加多个缓存实例,缓存实例将会在后面用到

  2. MyKeyGenerator 类的实现

// 缓存键的生成策略
public class MyKeyGenerator implements KeyGenerator {
    public Object generate(Object target, Method method, Object ... params) {
        return target.getClass().getName() + method.getName();
    }
}
  1. 新建 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 中添加的缓存实例的属性值,一定要对应上,否则会报错

  1. 当然对于一个类中,如果 @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");
    }
}
  1. 当我们在测试的时候发现,调用 get2() 方法的时候会报错,提示对于 User.class 没有转换器
    在这里插入图片描述
    当出现这种情况我们应该提供一个 JSON 格式的转换来处理实体类,解决方法也十分简单,只需要在 pom.xml 中添加 jackson 的依赖即可
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.7</version>
</dependency>

你可能感兴趣的:(#,springMvc,缓存,java,redis)