springboot番外之spring cache
阿新 • • 發佈:2018-12-12
Spring Cache
Spring Cache使用方法與Spring對事務管理的配置相似。Spring Cache的核心就是對某個方法進行快取,其實質就是快取該方法的返回結果,並把方法引數和結果用鍵值對的方式存放到快取中,當再次呼叫該方法使用相應的引數時,就會直接從快取裡面取出指定的結果進行返回。所以在使用Cache的時候我們要保證我們快取的方法對於相同的引數要有相同的返回結果。
-----------Spring對Cache的支援有兩種方法:
1.基於註解的配置
2.基礎XML配置
-----------------------------------------------------通過註解去使用到Cache------------------------------------------
[email protected]------------- @Cacheable可以註解在方法上也可以註解在類上。
當標記在方法上面時,表示該方法是可以快取的; 如果標記在類上面,則表示該類的所有方法都是可以快取的。 對於一個支援快取的方法,在執行後,會將其返回結果進行快取起來,以保證下次同樣引數來執行該方法的時候可以從快取中返回結果,而不需要再次執行此方法。Spring快取方法的返回值是以鍵值對進行儲存的,值就是返回結果,鍵的話Spring支援兩種策略,一種是預設策略,一種是自定義策略。
- @Cache(value="Cx")//Cache是指定在Cx上面的 或者指定多個@Cache(value={"Cx","Cx1"})
- public User getUser(String id){
- return .....;
- }
- @Cacheable(value="users", key="#id")
- public User find(Integer id) {
- returnnull;
- }
- @Cacheable(value="users", key="#user.id")
- public User find(User user) {
- returnnull;
- }
-----------------condition:指定發生條件 有時候可能不需要快取一個方法的所有結果。通過condition可以設定一個條件,其條件值是使用SpringEL表示式來指定的。當為true時進行快取處理;為false時不進行快取處理,即每次呼叫該方法都會執行。
- @Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
- @Caching(cacheable=@Cacheable("users"),evict={@CacheEvict("cache2"),@CacheEvict(value="cache3",allEntries=true)})<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
-------------------------------------------------------自定義註解----------------------------------------- [java] view plain copy print ?
- @Target({ElementType.TYPE, ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- @Cacheable(value="users")
- public @interface MyCacheable {
- }
---------------------------------------------------------------------------------------------------------------------------------------------- --------------------------配置Spring對Cache的支援 宣告對Cache的支援 1.基於註解 配置Spring對註解Cache的支援,我們需要在Spring配置檔案中新增Cache名稱空間,然後通過<cache:anotation-driven/> 就可以啟動Spring對註解Cache的支援。 其中<cache:anotation-driven/>有一個mode屬性,可以選擇值proxy和aspectj。預設使用proxy。當mode為proxy時,只有快取方法在外部被呼叫的時候才會生效。這也就意味著如果一個快取方法在一個物件的內部被呼叫SpringCache是不會發生作用的。而mode為aspectj時,就不會有這種問題了。另外使用proxy的時候,只有public方法上的@Cacheable才會發生作用。如果想非public上的方法也可以使用那麼就把mode改成aspectj。 注意:當我們mode使用aspectj和proxy-target-class為true時,定義在介面上的Cache註解是無法被識別的。<cache:cache-driven/>只會去尋找定義在同一個ApplicationContext下的@Cacheable等快取註解。
2.基於XML配置 Spring還支援使用XML檔案來配置,方式和配置事務管理類似。 [java] view plain copy print ?
- <cache:advice id="cacheAdvice" cache-manager="cacheManager">
- <cache:caching cache="users">
- <cache:cacheable method="findById" key="#p0"/>
- <cache:cacheable method="find" key="#user.id"/>
- <cache:cache-evict method="deleteAll" all-entries="true"/>
- </cache:caching>
- </cache:advice>
- <aop:config proxy-target-class="false">
- <aop:advisor advice-ref="cacheAdvice" pointcut="execution(* com.xxx.UserService.*(..))"/>
- </aop:config>
3.配置CacheManager CacheManager是Spring定義的一個用來管理Cache的介面。Spring自身提供了兩種,一種是基於JAVA API的ConcurrentMap,另一種是基於第三方Cache實現--Ehcache。 ---------------------基於ConcurrentMap的配置 [java] view plain copy print ?
- <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
- <property name="caches">
- <set>
- <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="xxx"/>
- </set>
- </property>
- </bean>
- <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcacheManager"/>
- <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache-spring.xml"/>
---------------------------------------------------------鍵的生成策略----------------------------------------------------------- 鍵的生成策略有兩種,一種是預設策略,一種是自定義策略。 ----------------------------預設策略: 預設的key是通過KeyGenerator生成的,其預設策略如下: 1.如果方法沒有引數,則使用0作為key; 2.如果只有一個引數的話則使用該引數作為key; 3.如果引數多於一個則使用所有引數的hashcode作為key;
----------------------------自定義策略: 自定義策略是指我們通過Spring的EL表示式來指定我們的key。這裡的EL表示式可以使用引數以及它們對應的屬性。使用方法引數時我們可以直接使用“#引數名”或者“#p引數index”。