@EnableCaching註解是spring framework中的註解驅動的緩存管理功能。自spring版本3.1起加入了該註解。若是你使用了這個註解,那麼你就不須要在XML文件中配置cache manager了。java
當你在配置類(@Configuration)上使用@EnableCaching註解時,會觸發一個post processor,這會掃描每個spring bean,查看是否已經存在註解對應的緩存。若是找到了,就會自動建立一個代理攔截方法調用,使用緩存的bean執行處理。spring
若是你對緩存感興趣並想了解更多,請閱讀spring caching. 本文會幫助你瞭解如何使用@EnableCaching註解。緩存
接下來的例子演示了@EnableCaching的用法。在代碼中,我緩存了Book類找那個的方法。post
//Book.java import org.springframework.cache.annotation.Cacheable; public class Book { @Cacheable(value = { "sampleCache" }) public String getBook(int id) { System.out.println("Method executed.."); if (id == 1) { return "Book 1"; } else { return "Book 2"; } } } //CachingConfig.java import java.util.Arrays; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.concurrent.ConcurrentMapCache; import org.springframework.cache.support.SimpleCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableCaching public class CachingConfig { @Bean public Book book() { return new Book(); } @Bean public CacheManager cacheManager() { SimpleCacheManager cacheManager = new SimpleCacheManager(); cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache("sampleCache"))); return cacheManager; } }
上面的java config和下面的xml配置文件是等效的:.net
<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>
//EnableCachingAnnotationExample.java import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class EnableCachingAnnotationExample { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(CachingConfig.class); ctx.refresh(); Book book = 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