Spring Aop學習筆記

2021-09-25 15:54:33 字數 2928 閱讀 5777

spring aop:

1.選擇連線點

比如:1.jdk**(連線點某個介面的imp方法):

乙個介面roleservice有個方法printrole(),

有個該介面的實現類roleserviceimp呼叫方法printrole(),設定該方法為連線點,在建立切面時定義

系統會為該imp類生成**物件,然後攔截printrole方法,於是可以產生各種aop通知方法。

2.cglib**(實現類的方法,不需要介面)

選擇乙個類的方法作為連線點,在建立切面類時定義。

2.建立切面類(roleaspect)

用@aspect註解乙個類,spring就會把這個類當作乙個切面。

該切面類實現可以實現5種通知:

@before("xx"):前置通知

@around("xx"):環繞通知

@after("xx"):後置通知

@afterreturning("xx"):返回通知(正常)

@afterthrowing("xx"):異常通知

"xx":execution("* com.ssm.xx.roleserviceimp.printrole(..)")

1.execution:代表執行方法的時候後會觸發。

2.*: 代表任意返回型別。

3.com.xx:代表連線點屬於的類(imp)的全限定類名。

4.printrole(..):被攔截的方法名稱(連線點),..代表任意引數。

更方便的操作:

1.定義乙個方法 public void print(){}

2.在他頭上加註解:@pointcut("execution("* com.ssm.xx.roleserviceimp.printrole(..)")")

3.這樣通知上直接使用該方法就行,比如:@before("print()")

3.新增配置

在config中使用註解:

1.@enableaspectjautoproxy:啟動aspectj框架的自動**。

2.@bean:返回乙個切面的例項

@bean

public roleaspect getroleservice()

4.測試(以註解的方式)

jdk**:

role r = new role(1l,"asd","asdss");

roleservice bean = ctx.getbean(roleservice.class); //獲取連線點該類的介面的bean。

bean.printrole(r);

cglib**:

role r = new role(1l,"asd","asdss");

roleserviceimp roleserviceimp = (roleserviceimp)ctx.getbean("roleserviceimp"); //獲取連線點該類的bean。

roleserviceimp.printrole(r);

環繞通知(@around):

public void around(proceedingjoinpoint jp) throws throwable catch (throwable throwable)

system.out.println("around after");//後置通知

}注意:1.引數proceedingjoinpoint,由spring提供,使用他可以反射連線點方法。

2.環繞通知的具體各個通知優先與其他通知執行,

around before

before--

role

around after

after

afterreturning。

給通知方法傳遞多個引數args:

1.在通知方法上定義引數型別before(role role,int sort)。

2.在註解上加 "&& args(role,sort)"

@before(execution("* com.ssm.xx.roleserviceimp.printrole(..)"+"&& args(role,sort)"))

public void before(role role,int sort)

引入: 簡介:有乙個類,需要條件約束,然後自定義乙個條件類,引入到切面從而起到約束的作用。

目的:獲得條件類,從而實現一定條件邏輯

重點:定義乙個介面和介面實現類(條件類),在需要條件化的類上實現該介面,然後可以在ioc容器中獲取需要條件化的類通過強制轉換 得到條件類,從而實現條件邏輯處理。

步驟:1.定義乙個介面和介面實現類(條件類)

2.在需要條件化的類上實現該介面

在切面類中定義該條件類介面的返回方法並新增註解@declareparents

@declareparents(value = "需要條件化的類的許可權定類名",defaultimpl = 條件類.class)

eg:@declareparents(value = "com.ssm.czk.annotation.aop.imp.roleserviceimp",defaultimpl = roleverifierimp.class)

public roleverifier roleverifier;

3.通過該類獲取條件類(強制轉換)

roleserviceimp roleserviceimp = (roleserviceimp)ctx.getbean("roleserviceimp");

roleverifier roleverifier = (roleverifier) roleserviceimp;

只要aop讓**物件掛到roleverifier介面下,就可以把對應的bean通過強制裝換

使用xml實現aop:

定義介面,介面實現類(如果要引入,private roleverifier roleverifier= null;),切面類(定義通知方法)

springAOP學習筆記

今天看spring的aop,頭都看暈了 切面aspect,連線點joinpoint 切入點pointcut,proxy,通知advice,前置通知before advice 後置通知after advice,異常通知after throwing advice 最終通知 after finally a...

springAOP學習筆記

springaop是面向切面程式設計,它一共有6個概念 joinpoint 連線點 所謂連線點是指那些被攔截到的點,在spring中這些點指的是方法,因為spring只支援方法型別的連線點 pointout 切入點 所謂切入點是指我們要對哪些joinpoint進行攔截的定義 advice通知 增強,...

學習筆記 Spring AOP

1 面向介面程式設計就是先把客戶的業務邏輯線提取出來,作為介面,業務具體實現通過該介面的實現類來完成。2 當客戶需求變化時,只需編寫該業務邏輯的新的實現類,通過更改配置檔案 例如spring框架 中該介面 3 更改實現類就可以完成需求,不需要改寫現有 減少對系統的影響。1 aop aspect or...