@EnableCaching注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。如果你使用了这个注解,那么你就不需要在XML文件中配置cache manager了。
当你在配置类(@Configuration)上使用@EnableCaching注解时,会触发一个post processor,这会扫描每一个spring bean,查看是否已经存在注解对应的缓存。如果找到了,就会自动创建一个代理拦截方法调用,使用缓存的bean执行处理。
如果你对缓存感兴趣并想了解更多,请阅读spring caching. 本文会帮助你了解如何使用@EnableCaching注解。
接下来的例子演示了@EnableCaching的用法。在代码中,我缓存了Book类找那个的方法。
importorg.springframework.cache.annotation.Cacheable; public class Book{ @Cacheable(value="simpleCache") public String getBook(int id){ System.out.println("Method cached"); if(id==1){ return "Book 1"; }else{ return "Book 2"; } } } importorg.springframework.cache.CacheManager; importorg.springframework.cache.annotation.EnableCaching; importorg.springframework.cache.concurrent.ConcurrentMapCache; importorg.springframework.cache.support.SimpleCacheManager; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importjava.util.Arrays; @Configuration @EnableCaching public class CachingConfig{ @Bean public Book book(){ return new Book(); } @Bean public CacheManager cacheManager(){ SimpleCacheManager simpleCacheManager = new SimpleCacheManager(); simpleCacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("simpleCache"))); return simpleCacheManager; } } importorg.springframework.context.annotation.AnnotationConfigApplicationContext; public class EnableCachingAnnotationExample{ public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.register(CachingConfig.class); context.refresh(); Bookbook=context.getBean(Book.class); System.out.println(book.getBook(1)); System.out.println(book.getBook(1)); System.out.println(book.getBook(2)); context.close(); } }
上面的java config和下面的xml配置文件是等效的:
<beans>
<cache:annotation-driven/><bean id ="book" class = "Book"/>
<bean id ="cacheManager" class = "org.springframework.cache.support.SimpleCacheManager">
<property name = "caches">
<set>
<bean class = "org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean">
<property name = "name" value = "sampleCache"/>
</bean>
</set>
</property>
</bean>
</beans>
测试类
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
public class EnableCachingAnnotationExample{
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(CachingConfig.class);
ctx.refresh();
Bookbook ctx.getBean(Book.class);
// calling getBook method first time.
System.out.println(book.getBook(1));
// calling getBook method second time. This time, method will not
// execute.
System.out.println(book.getBook(1));
// calling getBook method third time with different value.
System.out.println(book.getBook(2));
ctx.close();
}
}
输出:
Method executed..
Book 1
Book 1
Method executed..
Book 2
</div>