Spring
使用 spring 中的缓存。
例子
- User.java
用于测试的实体。
public class User {
    private Long id;
    
    private String name;
    //Getter & Setter
    //toString()
}
- UserService.java
用户服务类接口。
public interface UserService {
  /**
   * 获取用户
   * @param id 标识
   * @return 用户
   */
  User getUser(Long id);
  /**
   * 删除用户
   * @param id 标识
   */
  void deleteUser(Long id);
  /**
   * 更新用户
   * @param user 用户
   * @return 用户
   */
  User updateUser(User user);
  /**
   * 清除缓存
   */
  void clearCache();
}
- UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
    /**
     * Cacheable triggers cache population
     */
    @Override
    @Cacheable(value = "user", key = "'user_id_' + #id")
    public User getUser(Long id) {
        System.out.println("get user: " + id);
        User user = new User();
        user.setId(id);
        return user;
    }
    @Override
    @CacheEvict(value = "user", key = "'user_id_'+#id")
    public void deleteUser(Long id) {
        System.out.println("delete user: " + id);
    }
    /**
     * updated without interfering with the method execution
     * - 将返回的结果,放入缓存
     */
    @Override
    @CachePut(value = "user", key = "'user_id_'+#user.getId()")
    public User updateUser(User user) {
        System.out.println("update user: " + user);
        user.setName("cachePut update");
        return user;
    }
    @Override
    @CacheEvict(value = "user", allEntries = true)
    public void clearCache() {
        System.out.println("clear all user cache");
    }
}
- applicationContext-cache.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
    <!-- Activates annotation-based bean configuration -->
    <context:annotation-config/>
    <!-- Scans for application @Components to deploy -->
    <context:component-scan base-package="com.github.houbb.redis.learn.spring.cache"/>
    <cache:annotation-driven/>
    <!-- spring自己的缓存管理器,这里定义了缓存位置名称 ,即注解中的value -->
    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
        <property name="caches">
            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
                  p:name="user"/>
        </property>
    </bean>
</beans>
测试
- 读取
@ContextConfiguration(locations = {"classpath:applicationContext-cache.xml"})
@SpringJUnitConfig
public class UserServiceTest {
    @Autowired
    private UserService userService;
    /**
     *
     * Method: getUser(Long id)
     *
     */
    @Test
    public void getUserTest() throws Exception {
        User user1 = userService.getUser(1L);
        User user2 =userService.getUser(1L);
        System.out.println(user1);
        System.out.println(user2);
    }
}
日志
...
get user: 1
User{id=1, name='null'}
User{id=1, name='null'}
可见,第二次查询时走的实际上是缓存。
自己实现
思路
- 定义注解
模仿 spring 注解。
- 定义拦截器
基于上述注解的对应实现。
