使用註解實現AOP

2021-10-05 13:32:49 字數 3020 閱讀 8514

1.匯入jar包:

與用介面實現 的jar包相同

2.配置:

a.將業務類和通知類納入springioc容器;

b.在容器中開啟註解對aop的支援:

c.將類使用註解方式(@component)放入ioc容器中時,要將該類所在的包新增到掃瞄器中;

3.編寫

通知類:

1.加入註解 @aspect,不用再實現介面;但是要開啟註解對aop的支援,該註解不需要掃瞄器。

如://通知類(使用注釋方式)

@aspect //宣告該類 是乙個通知類

public class logbefore_annotation

2.在通知類中使用註解定義通知型別:

前置通知:

@before("execution(切入點)") //或 @before(pointcut ="execution(切入點)")

如:@before("execution(public void org.service.impl.studentserviceimpl.addstudent(org.entity.student))")

public void mybefore()

後置通知:

a.不需要使用方法(切點)的返回值:

@afterreturning("execution(切入點)")//或 @afterreturning(pointcut ="execution(切入點)")

b.需要使用方法(切點)的返回值:

@afterreturning(pointcut ="execution(切入點)", )

如:@afterreturning("execution(public void org.service.impl.studentserviceimpl.addstudent(org.entity.student))")

public void myafter()

環繞通知:

@around("execution(切入點)")//或 @around(pointcut ="execution(切入點)")

如:/**

* 環繞通知

* 方法引數為:proceedingjoinpoint型別

*/@around("execution(public void org.service.impl.studentserviceimpl.addstudent(org.entity.student))")

public void myaround(proceedingjoinpoint jp)catch(throwable e )finally

}最終通知:

@after("execution(切入點)")//或 @after(pointcut ="execution(切入點)")

如:/**

* 最終通知

*/@after("execution(public void org.service.impl.studentserviceimpl.addstudent(org.entity.student))")

public void myafter()

異常通知:

@afterthrowing("execution(切入點)")//或 @after(pointcut ="execution(切入點)")

如:public void myexception()

特定異常通知(如捕獲空指標的異常通知):

@afterthrowing(pointcut = "execution(切入點)", throwing = "e")

如:/**

* 異常通知

* 如果只捕獲特定型別的異常,需要第二個引數來實現:e

* 如:該異常通知只捕獲空指標異常 則使用:nullpointerexception型別

** **測試該類時,需要將上述環繞通知注釋掉,否則該類無法捕獲異常**

*/@afterthrowing(pointcut = "execution(public void org.service.impl.studentserviceimpl.addstudent(org.entity.student))",

throwing = "e")

public void myexception(joinpoint jp, nullpointerexception e)

3.獲取目標物件的一些引數:

通過註解形式實現的aop,如果想獲取 目標物件的一些引數,則需要使用乙個物件:jointpoint

後置通知中獲取引數:

目標物件: jp.gettarget()

呼叫的方法名:jp.getsignature().getname()

方法的引數個數:jp.getargs().length

方法得到返回值:returnin**alue

注:註解形式返回值問題:

a.註解屬性中宣告返回值的引數名returning

/***後置通知

* @afterreturning 中pointcut是定義的切點、 returning是切點方法返回值型別

*/@afterreturning(pointcut = "execution(public void org.service.impl.studentserviceimpl.addstudent(org.entity.student))",

returning = "returnin**alue")

public void myafter(joinpoint jp, object returnin**alue)

b.註解形式實現aop時,通知方法中的引數不能自定義。

業務類:

studentserviceimpl中的addstudent()方法

將通知類和業務類放入ioc容器中:

1.直接在ioc中新增;

2.使用註解時,要注意將該類所在包新增到掃瞄器中;

使用註解:

@component("id值")

使用註解實現AOP

xml標頭檔案中加入 xmlns context xsi schemalocation spring context.xsd 宣告哪些包下有註解 當有兩個以上的包時,用 隔開 在demo類中加入 component 在方法上新增 pointcut 定義切點 component public clas...

使用AOP實現快取註解

半年前寫了乙個註解驅動的快取,最近提交到了github。快取大量的被使用在應用中的多個地方,簡單的使用方式就是 先查詢快取中是否存在資料,如果不存在或者快取過期再查詢資料庫,並將查詢的結果快取一段時間,快取key通常是入參的物件或者入參物件的某些屬性,有些時候還需要按照某種條件判斷是否快取。可以看到...

註解實現AOP

使用註解實現aop,注意版本問題,使用註解報錯要匯入m en依賴 dependency groupid j ax.annotation groupid artifactid j ax.annotation api artifactid version 1.3.2 version dependency...