Spring @cacheable註解實現的快取
https://blog.csdn.net/u010251278/article/details/76229085
在軟體開發中使用快取已經有一個非常久的歷史了。快取是一種很好的設計思想,一旦你用了他,你將會發現他確實很有用。Spring3.1版本的核心對快取做了實現。在Java推出Annotation特性之前,實現快取的一個難點在於它與業務邏輯程式碼的耦合性太強。然而,Spring中使用@Cacheable 和@CacheEvict實現快取在某種程度上解決了這個問題,基本思想是在方法加上@Cacheable註解,這個方法的返回值將具有快取特性。
@Cacheable註解可以用在方法或者類級別。當他應用於方法級別的時候,就是如上所說的快取返回值了。當應用在類級別的時候,這個類的所有方法的返回值都將被快取。
@Cacheable(value = "employee")
public class EmployeeDAO {
public Person findEmployee(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
public Person findAnotherEmployee(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
}
@Cacheable註解有三個引數,value是必須的,還有key和condition。第一個引數,也就是value指明瞭快取將被存到什麼地方。
@Cacheable(value = "employee")
public Person findEmployee(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
上面的程式碼保證findEmployee的返回值Person物件將被儲存在"employee"中。
任何儲存在快取中的資料為了高速訪問都需要一個key。Spring預設使用被@Cacheable註解的方法的簽名來作為key,當然你可以重寫key,自定義key可以使用SpEL表示式。
@Cacheable(value = "employee", key = "#surname") public Person findEmployeeBySurname(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
在findEmployeeBySurname()的註解中"#surname"是一個SpEL表示式,他將使用findEmployeeBySurname()方法中的surname引數作為key。
@Cacheable的最後一個引數是condition(可選),同樣的,也是引用一個SpEL表示式。但是這個引數將指明方法的返回結果是否被快取。
@Cacheable(value = "employee", condition = "#age < 25")
public Person findEmployeeByAge(String firstName, String surname, int age) {
return new Person(firstName, surname, age);
}
上面的例子中,只有年齡小於25的時候才被快取。
在快速看完了如何使用快取後,我們接下來看看快取帶來的效果。
@Test
public void testCache() {
Person employee1 = instance.findEmployee("John", "Smith", 33);
Person employee2 = instance.findEmployee("John", "Smith", 33);
assertEquals(employee1, employee2);
}
上面的例子很簡單,第一次呼叫findEmployee,findEmployee方法將被執行,Spring將他的返回值一個person物件存入快取。第二次呼叫findEmployee的時候findEmployee將不被執行,Spring直接將快取中的資料作為返回值返回。所以employee1 和employee2引用了同樣的物件。
而下面的例子中,我們將年齡小於25作為快取條件,就將得到不同的結果。
@Test
public void testCacheWithAgeAsCondition() {
Person employee1 = instance.findEmployeeByAge("John", "Smith", 33);
Person employee2 = instance.findEmployeeByAge("John", "Smith", 33);
assertEquals(employee1, employee2);
}
下面的例子我們在findEmployeeBySurname的方法的註解中自定義了key,我們使用了自定義的key生成方式,以確保不同的surname將會指向不同的人。看下面的程式
@Test
public void testCacheOnSurnameAsKey() {
Person employee1 = instance.findEmployeeBySurname("John", "Smith", 22);
Person employee2 = instance.findEmployeeBySurname("Jack", "Smith", 55);
assertEquals(employee1, employee2);
}
我們想找到兩個不同的人,但是兩個人的surname是相同的,你將發現兩次呼叫返回了相同的結果,這不是Spring的問題,而是我們的cache key的生成方式有問題。所以在我們定義key的時候要小心注意key的生成策略,避免造成這種問題。
最後總結一下流程,當執行到一個被@Cacheable註解的方法時,Spring首先檢查condition條件是否滿足,如果不滿足,執行方法,返回;如果滿足,在value所命名的快取空間中查詢使用key儲存的物件,如果找到,將找到的結果返回,如果沒有找到執行方法,將方法的返回值以key-物件的方式存入value快取中,然後方法返回。這裡只是介紹了簡單的spring @cacheable註解的用法,更詳細的使用可以參考下面的參考資料。
相關文章
- Spring 快取註解@Cacheable的用法Spring快取
- Spring快取註解@Cacheable、@CacheEvict、@CachePut使用Spring快取
- spring 快取 @Cacheable 錯誤總結Spring快取
- Spring Cache快取註解Spring快取
- Spring 框架快取註解Spring框架快取
- Spring : 快取相關注解@EnableCaching、@CacheConfig、@Cacheable、@CachingSpring快取
- spring配置redis註解快取SpringRedis快取
- Spring AOP整合redis(註解方式) 實現快取統一管理SpringRedis快取
- @Cacheable關於快取的個人筆記快取筆記
- Spring 快取註解這樣用,太香了!Spring快取
- Spring Cache 快取註解這樣用,實在是太香了!Spring快取
- Spring-Boot專案中配置redis註解快取SpringbootRedis快取
- Spring Boot系列十八 Spring AOP + 註解實現統一註解Spring Boot
- Spring:如何實現註解的組合Spring
- Spring Aop基於註解的實現Spring
- SpringBoot 註解呼叫Redis快取Spring BootRedis快取
- springboot整合redis2.x,使用spring註解進行快取Spring BootRedis快取
- spring原始碼解析:元註解功能的實現Spring原始碼
- spring boot使用Jedis整合Redis實現快取(AOP)Spring BootRedis快取
- 搞懂分散式技術14:Spring Boot使用註解整合Redis快取分散式Spring BootRedis快取
- springboot註解方式使用redis快取Spring BootRedis快取
- Spring基於註解實現 AOP 切面功能Spring
- @ComponentScan註解的實現,Spring掃描包的過程Spring
- 如何實現一個簡易版的 Spring - 如何實現 @Autowired 註解Spring
- @PropertySource 註解實現讀取 yml 檔案
- Spring 快取Spring快取
- 【Spring註解驅動開發】使用@Lazy註解實現懶載入Spring
- EVCache快取在 Spring Boot中的實戰快取Spring Boot
- Spring Ioc原始碼分析系列--@Autowired註解的實現原理Spring原始碼
- 精盡Spring Boot原始碼分析 - @ConfigurationProperties 註解的實現Spring Boot原始碼
- Ehcache介紹及整合Spring實現快取記憶體Spring快取記憶體
- 基於Spring Cache實現二級快取(Caffeine+Redis)Spring快取Redis
- spring基於註解配置實現事務控制Spring
- SpringBoot快取管理(二) 整合Redis快取實現Spring Boot快取Redis
- 快取架構中的服務詳解!SpringBoot中二級快取服務的實現快取架構Spring Boot
- SpringBoot註解使用redis做快取總結Spring BootRedis快取
- SpringBoot之日誌註解和快取優化Spring Boot快取優化
- 使用ConcurrentHashMap實現快取HashMap快取