當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring对AspectJ的支持
生活随笔
收集整理的這篇文章主要介紹了
Spring对AspectJ的支持
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.AspectJ介紹及Pointcut注解應用
(1)AspectJ
- @AspectJ的風格類似純java注解的普通java類
- Spring可以使用AspectJ來做切入點解析
- AOP的運行時仍舊是純的Spring AOP,對AspectJ的編譯器或者織入無依賴性
(2)Spring中配置@AspectJ
- 對@AspectJ支持可以使用XML或者Java風格的配置
- 確保AspectJ的aspectjweaver.jar庫包含在應用程序(版本1.6.8或者更高版本)的classpath中
java注解方式:
@Configuration @EnableAspectJAutoProxy public class AppConfig{}xml方式:
<aop:aspectj-autoproxy/>(3)@Aspect注解的使用
- @AspectJ切面使用@Aspect注解配置,任何擁有@Aspect的bean將被Spring自動識別并應用
- 用@Aspect注解的類可以有方法和字段,他們也可能包括切入點(pointcut),通知(advice)和引入(introduction)聲明
- @Aspect注解是不能夠通過類路徑自動檢測發現的,所以需要配合使用@Component注釋或者在xml配置bean
1)在xml中配置bean
<bean id="myAspect" class="org.xyz.NotVeryUsefulAspect"><!--configure properties of aspect here as nomal--> </bean>2)使用@Component注釋
package org.xyz; import org.sapectj.lang.annotation.Aspect;@Aspect public class NotVeryUsefulAspect{ }- 一個類中的@Aspect注解標識它為一個切面,并且將自己從自動代理中排除,否則會出現死循環
(4)pointcut
- 一個切入點通過一個普通的方法定義來提供,并且切入點表達式使用@Pointcut注解,方法返回類型必須為void
- 定義一個名為‘anyOldTransfer’,這個切入點將匹配任何名為“transfer”的方法的執行
- 切入點支持的定義方式
- execution:匹配方法執行的連接點
- within:限定匹配特定類型的連接點
- this:限定匹配特定連接點的bean引用是指定類型的實例
- target:限定匹配特定連接點的目標對象是指定類型的實例
- args:限定匹配特定連接點的參數是指定類型的實例
- @target:限定匹配特定連接點的類執行對象的具有給定類型的注解
- @args:限定匹配特定連接點實際傳入參數的類型具有給定類型的注解‘
- @within:限定匹配到具有給定的注釋類型的連接點
- @annotation:限定匹配特定連接點的主體具有給定的注解
(5)組合pointcut
- 切入點表達式可以通過&&、||、!進行組合,也可以通過名字引入切入點表達式
- 通過組合,可以建立更加復雜的切入點表達式
(6)定義良好的pointcuts
- AspectJ是編譯期的AOP
- 檢查代碼并匹配連接點與切入點的代價是昂貴的
- 一個好的切入點應該包括以下幾點
- 選擇特定類型的連接點,如:execution,get,set,call,handler
- 確定連接點范圍,如:within,withincode
- 匹配上下文信息,如:this,target,@annotation
2.Advice定義及實例
(1)Before advice
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component;@Component @Aspect public class ExampleAspect{//在執行com.xyz.aop.aspectj包下以Biz結尾的類的所有方法時匹配Advice@Before("*execution(* com.xyz.aop.aspectj.biz.*Biz.*(..))")public void before(){//.. } }(2)After returning advice
@Aspect public class AfterReturningExample{@AfterReturning("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")public void doAccessCheck(){//... } }- 有時候需要在通知體內得到返回的實際值,可以使用@AfterReturning綁定返回值的形式
(3)After throwing advice
@Aspect public class AfterThrowingExample{@AfterThrowing("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")public void doRecoveryActions(){//... } }- 有時候需要在通知體內得到返回的實際值,可以使用@AfterReturning綁定的返回值的形式
(4)After (finally) advice
- 最終通知必須準備處理正常和異常兩種返回情況,它通常用于釋放資源
(5)Around advice
- 環繞通知使用@Around注解來聲明,通知方法的第一個參數必須是ProceedingJoinPoint類型
- 在通知內部調用ProceedingJoinPoint的proceed()方法會導致執行真正的方法,傳入一個Object[]對象,數組中的值將被作為參數傳遞給方法
3.Advice擴展
(1)給advice傳遞參數
方式一:
@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() && args(account,..)") public void validateAccount(Account account){//... }方式二:
@Pointcut("com.xyz.myapp.SystemArchitecture.dataAccessOperation() && args(account,..)") private void accountDataAccessOperation(Account account){}@Before("accountDataAccessOperation(account)") //Account account:這里的方法參數可以是任何類的對象 public void validateAccount(Account account){//... }方式三:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Auditable{Auditable value(); } @Before("com.xyz.lib.Pointcuts.anyPublicMethod()&&@annotation(auditable)") public void audit(Auditable auditable){AuditCode code=auditable.value();//... }(2)Advice的參數及泛型
- Spring AOP可以處理泛型類的聲明和使用方法的參數
方式一:
@Before("execution(* ..Sample+.sampleGenericMethod(*)) && args(param)") public void beforeSampleMethod(MyType param){//Advice implementation }方式二:
@Before("execution(* ..Sample+.sampleGenericCollectionMethod(*)) && args(param)") public void beforeSampleMethod(Collection<MyType> param){//Advice implementation }(3)Advice參數名稱
- 通知和切入點注解有一個額外的“argNames”,它可以用來指定所注解的方法的參數名
- 如果第一個參數是JoinPoint,ProceedingJoinPoint,JoinPoint.StaticPart,那么可以忽略它
(4)Introductions
- 允許一個切面聲明一個通知對象實現指定接口,并且提供了一個接口實現類來代表這些對象
- introduction使用@DeclareParents進行注解,這個注解用來定義匹配的類型擁有一個新的parent
- 例如:給定一個接口UsageTracked,并且該接口擁有DefaultUsageTracked的實現,接下來的切面生命了所有的service接口的實現都實現了UsageTracked接口
(5)切面實例化模型
- 這是一個高級主題
- “perthis”切面通過制定@Aspect注解perthis子句實現
- 每個獨立的service對象執行時都會創建一個切面實例
- service對象的每個方法在第一次執行的時候創建切面實例,切面在service對象失效的同時失效
轉載于:https://www.cnblogs.com/chanaichao/p/9267173.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Spring对AspectJ的支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统安全
- 下一篇: javascript构造函数类和原型pr