spring从3.1起自带了cache功能。可以缓存一个方法的返回值,也就是说如果有缓存,spring就会直接使用缓存值,而不会再去执行这个方法;
cashe相关的功能是在spring-context.4.2.5.RELEASE.jar这个jar包中的。
在applicationContext.xml中首先加入相关schemaLocation.
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
">
</beans>
然后,开启cache注解,配置cacheManager:
<!-- 启用缓存注解功能(请将其配置在Spring主配置文件中) -->
<cache:annotation-driven />
<!-- Spring自己的基于java.util.concurrent.ConcurrentHashMap实现的缓存管理器(该功能是从Spring3.1开始提供的) -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
<property name="caches">
<set>
<bean name="getUserById"
class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" />
</set>
</property>
</bean>
在service中使用@Cacheable注解:
@Service
public class UserService {
@Autowired UserDaoImpl userDaoImpl;
@Cacheable(value="getUserById", key="#id")
public User getUserById(int id){
System.out.println("执行getUserById");
return userDaoImpl.getUserById(id);
}
}
第一次调用getUserById方法会打印"执行getUserById",第二次调用不会打印。重启服务后缓存会被清空,因为是存在内存里的。