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...