基本原理
和 spring 的事務管理類似,spring cache 的關鍵原理就是 spring AOP,通過 spring AOP,其實現了在方法調用前、調用后獲取方法的入參和返回值,進而實現了緩存的邏輯。我們來看一下下面這個圖:
圖 2. 原始方法調用圖
上圖顯示,當客戶端“Calling code”調用一個普通類 Plain Object 的 foo() 方法的時候,是直接作用在 pojo 類自身對象上的,客戶端擁有的是被調用者的直接的引用。
而 Spring cache 利用了 Spring AOP 的動態代理技術,即當客戶端嘗試調用 pojo 的 foo()方法的時候,給他的不是 pojo 自身的引用,而是一個動態生成的代理類
圖 3. 動態代理調用圖
如上圖所示,這個時候,實際客戶端擁有的是一個代理的引用,那么在調用 foo() 方法的時候,會首先調用 proxy 的 foo() 方法,這個時候 proxy 可以整體控制實際的 pojo.foo() 方法的入參和返回值,比如緩存結果,比如直接略過執行實際的 foo() 方法等,都是可以輕松做到的
限制
基於上述的原理說明,我們知道其框架存在以下的限制:
1、內部類之間的調用,緩存注解將起不到任何的作用
2、方法必須聲明為public
3、注解只能放在方法體上,若是緩存的邏輯顆粒度更加的細小,則不能實現
4、緩存邏輯簡單,不能做更加深入的邏輯判斷