使用注解的AOP編程
當注解沒有參數時
當使用注解進行面向切面編程(AOP)時,你可以按照以下步驟來實現:
步驟:
1. 創建自定義注解:
首先,創建自定義的注解,以便在代碼中標記需要進行橫切操作的方法或類。
import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyCustomAnnotation {// 定義注解的屬性(可選)
}
2. 創建切面類:
創建一個切面類,在切面類中定義相應的通知(advice),如 @Before
、@After
、@Around
等,以及指定切入點表達式來匹配需要執行橫切邏輯的位置。
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;@Aspect
@Component
public class MyAspect {@Around("@annotation(com.example.MyCustomAnnotation)")public Object myAdvice(ProceedingJoinPoint joinPoint) throws Throwable {// 執行目標方法前的邏輯// 可以獲取特定注解的信息,執行額外操作Object result = joinPoint.proceed(); // 執行目標方法// 執行目標方法后的邏輯// 可以處理目標方法執行后的結果或執行其他操作return result;}
}
3. 將切面類注冊為 Spring Bean:
確保切面類被 Spring 容器管理,這樣它才能夠被應用到目標類的方法上。
4. 在目標類或方法上使用自定義注解:
@MyCustomAnnotation
public void myMethod() {// 這個方法會被切面攔截并執行 MyAspect 中定義的 myAdvice 方法的邏輯// 可以在此方法中定義業務邏輯
}
5. 運行程序:
確保 Spring 應用程序能夠正常啟動,并且切面邏輯能夠被成功應用于被標記的方法或類中。
總結:
使用注解的 AOP 編程主要步驟包括:定義自定義注解,創建切面類并編寫相應的通知方法和切入點表達式,將切面類注冊為 Spring Bean,并在需要的目標方法或類上使用自定義注解。這樣,切面類中定義的邏輯就可以在被標記的方法或類執行時生效,實現橫切關注點的操作。
當注解有參數要獲取里面的參數時
當使用注解進行面向切面編程(AOP)時,如果需要操作注解中的參數,可以按照以下步驟進行:
步驟:
1. 創建自定義注解:
首先,創建自定義的注解,并在注解中定義所需的屬性,以便在被標記的方法或類中使用。
import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyCustomAnnotation {String value(); // 添加需要的參數
}
2. 創建切面類:
創建一個切面類,在切面類中定義相應的通知(advice),同時通過方法參數獲取注解中的屬性值。
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.AnnotationUtils;@Aspect
@Component
public class MyAspect {@Around("@annotation(myAnnotation)") // 通過參數獲取注解public Object myAdvice(ProceedingJoinPoint joinPoint, MyCustomAnnotation myAnnotation) throws Throwable {String annotationValue = myAnnotation.value(); // 獲取注解中的屬性值// 執行目標方法前的邏輯// 可以使用注解中的屬性值執行額外操作Object result = joinPoint.proceed(); // 執行目標方法// 執行目標方法后的邏輯// 可以處理目標方法執行后的結果或執行其他操作return result;}
}
代碼中能夠直接用@Around(“@annotation(myAnnotation)”) 的原因介紹:
在這段代碼中,
@Around("@annotation(myAnnotation)")
表達式使用了 AspectJ 的切入點表達式,其中@annotation()
是用于匹配帶有特定注解的方法的一種方式。這個表達式告訴切面,當被攔截的方法上存在指定的myAnnotation
注解時,應該執行橫切邏輯。在這里,
@Around
注解中的@annotation(myAnnotation)
表達式中的myAnnotation
是作為參數傳入myAdvice
方法的,表示該方法參數中的特定注解實例。AspectJ 允許使用
@annotation()
來匹配帶有特定注解的方法。當執行被切入點所匹配的方法時,切面會攔截該方法并執行myAdvice
方法中定義的邏輯,同時允許通過joinPoint.proceed()
執行原始方法。在執行時,AspectJ會檢查被攔截的方法上是否存在
myAnnotation
注解,并在滿足條件時執行myAdvice
中的邏輯。這樣你可以在方法執行前后做一些額外的操作,例如權限校驗、日志記錄等。簡單來說就是原來對注解的匹配變成了從方法參數中取這個注解的定義了。
3. 將切面類注冊為 Spring Bean:
確保切面類被 Spring 容器管理,這樣它才能夠被應用到目標類的方法上。
4. 在目標類或方法上使用自定義注解,并傳遞參數:
@MyCustomAnnotation(value = "someValue")
public void myMethod() {// 這個方法會被切面攔截并執行 MyAspect 中定義的 myAdvice 方法的邏輯// 可以在此方法中定義業務邏輯
}
總結:
- 定義自定義注解:在注解中添加需要的參數。
- 創建切面類:使用
@Around
或其他通知注解,在方法簽名中加入注解類型的參數,通過該參數獲取注解中的屬性值。 - 將切面類注冊為 Spring Bean:確保切面類被 Spring 容器管理。
- 在目標方法或類上使用自定義注解:使用自定義注解并傳遞所需的參數,這樣切面就能夠獲取并操作注解中的參數信息。