1. 自訂一個註解
@Target(value = { ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface CacheNullify { boolean value = true; }
2.實作增強邏輯
@Slf4j @Aspect @Component public class CacheNullifyHandler { @AfterReturning("@annotation(com.xxx.CacheNullify)") public void afterReturning() { log.info("走你"); CacheServiceUtil.delUserInfoCache(); } }
@annotation
: 後面跟的是你要增強的註解(所註解的方法), 可以直接寫註解名,但為了防止重名盡可能寫全路徑吧
@AfterReturning
: 方法執行完並成功回傳則觸發
@After
: 方法完畢後觸發(包括執行完畢, 或拋出例外)
3. 使用
在需要增強的方法上加上@CacheNullify註解
先了解切面和自訂註解的基本概念和使用
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,透過預編譯方式和運行期間動態代理實現程序功能的統一維護的一種技術。
AOP是OOP的延續,是軟體開發中的熱點,也是Spring框架中的重要內容,是函數式程式設計的衍生範式。
利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
Aspect(切面)
Aspect 宣告類似Java 中的類聲明,在Aspect 中會包含著一些Pointcut 以及對應的Advice。
Joint point(連接點)
#指那些被攔截的點,在spring中這些點指的是方法。
Pointcut(切入點)
#表示一組joint point,這些joint point 或是透過邏輯關係組合起來,或透過通配、正規表示式等方式集中起來,它定義了對應的Advice 將要發生的地方。
Advice(增強功能/通知)
#Advice 定義了在Pointcut 裡面定義的程式點具體要做的操作,它透過before、after 和around 來區別是在每個joint point 之前、之後還是代替執行的程式碼。
Introduction(引介)
#一種特殊的通知,可以在不修改原始碼的情況下動態添加一些方法。
Target(目標物件)
# 織入 Advice 的目標物件。
Weaving(織入)
#將Aspect 和其他物件連接起來, 並建立Adviced object 的過程
註解是一種能被加入到java原始碼中的元數據,方法、類別、參數和套件都可以用註解來修飾。
註解可以看作是一種特殊的標記,可以用在方法、類別、參數和套件上,程式在編譯或執行時可以偵測到這些標記而進行一些特殊的處理。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface MyAnnotation { String value() default""; }
分析上面的註解組成
public:修飾符
存取修飾符必須為public,不寫預設為pubic;
#@interface:關鍵字
關鍵字為@interface;
MyAnnotaion:註解名稱
註解名稱為自訂註解的名稱,例如上面的MyAnnotaion就是註解名稱
value:註解類型元素
註解類型元素是註解中內容,根據需要標誌參數,例如上面的註解的value;
#但仔細分析還包含@開頭的四個註解@Target、@Retention、@Inherited、@Documented )這是四個是底層的元註解,註解其他註解的註解
@Target:用來描述註解的使用範圍,註解可以使用在什麼地方
Target類型 說明
ElementType.TYPE
套用於類別、介面(包括註解類型)、枚舉
#ElementType.FIELD
套用於屬性(包含列舉中的常數)
ElementType.METHOD
套用於方法
#ElementType.PARAMETER
應用於方法的形參考
ElementType.CONSTRUCTOR
應用於建構子
ElementType.LOCAL_VARIABLE
套用於局部變數
ElementType.ANNOTATION_TYPE
套用於註解類型
#ElementType.PACKAGE
套用於套件
備註:例如@Target(ElementType.METHOD),標誌的註解使用在方法上,但是我們在這個註解標誌在類別上,就會報錯
@Retention:顯示該註解的生命週期
##生命週期類型 描述RetentionPolicy.SOURCE# 編譯時丟棄,不包含在類別檔案中
RetentionPolicy.CLASS JVM載入時丟棄,包含在類別檔案中,預設值
#RetentionPolicy.RUNTIME 由JVM 加載,包含在類別文件中,在運行時可以被獲取到
以上是java自訂切面增強的方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!