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