今天主要是AOP編程,徐老師先講了原理,由淺入深,最 后讓開發由aspectJ來完成,使開發更簡單,收獲蠻大
1.Aspect術語
通知:切面的實際實現,他通知系統新的行為。如在日志通知包含了實
現日志功能的代碼,如向日志文件寫日志。通知在連接點插入 到應用系統中。
連接點::應用程序執行過程中插入切面的地點,可以是 方法調用,異常拋出,或者 要修改的字段。
切入點:定義了通知應該應用在哪些連接點, 通知可以應用到AOP框架支持的任何 連接點。
引入:不變源代碼的情況下,為類添加新方法 和屬性。
目標對象::被通知的對象。既可以是你編寫的類也可以是 第三方類。
代理對象:嶄新的對象,將通知應用到目標對 象后創建的對象,應用系統的其他部 分不用為了支持代理對象而 改變。
織入:將切面應用到目標對象從而創建一個新代理對 象的過程。織入發生在目標
對象生命周期的多個點上:
編譯期:切面在目標對象編譯時織入.這需要一個特殊的編譯器.
類裝載期:切面在目標對象被載入JVM時織入.這需要一個特殊的類載入器.
運行期:切面在應用系統運行時織入.
4.切入點:定義了通知應該應用在哪些連接點,通知可以應用到AOP框架支持的任何連接點。
兩種:jdk動態代理(接口,松耦合),cglib(對類代理)
2.方法介紹
一.通知類型
1.前置通知
public interface MethodBeforeAdvice{
void before(Method m,Object[]
os ,Object target){
}
}
該接口提供了獲得目標方法、參數和目標對象的機會。不能夠改變運行時參數,即不能替換參數對象和目 標對象。
注意在方法結束后不返回任何值東西。原因是該接口返回后,目標方法將會被調用,應該返回目標對象的 返回值。該接口唯一能
阻止目標方法被調用的途徑是拋出異常或(System.exit())。
2.動態代理對象ProxyFactoryBean是一個在BeanFactory中顯式創建代理對象的中心類,可以給它一個
要實現的接口、一個要代理的目標對象、一個
要織入的通知,并且他將創建一個嶄新的代理
對象。
3.后置通知
同前置通知類似。
public interface AfterReturningAdvice{
public void afterReturning(Object returnValue,Method
m,Object[] os,Object target);
}
多了一個返回值。
4.環繞通知
public interface MethodInterceptor extends Interceptor{
Object invoke(MethodInvocation invocation);
}
該接口同前兩種通知有兩個重要區別:1.該通知能夠控制目標方法
是否真的被調用。通過invocation.proceed()方法來調用。
2.該通知可以控制返回的對象??梢苑祷匾粋€與proceed()方法返回對象完全不同的對象。但要謹慎使用。
5.異常通知
public interface ThrowsAdvice{
}
該接口為標識性接口,沒有任何方法,但實現該接口的類必須要有如下形
式的方法:
void afterThrowing(Throwable throwable);
void afterThrowing(Method m,Object[] os,Object
target,Throwable throwable);
第一個方法只接受一個參數:需要拋出的異常。
第二個方法接受異常、被調用的方法、參數以及目標對象。
二.創建切入點方法
1. 切入點根據方法和類決定何處 織入通知。ClassFilter接口決定了一個類
是否符合通知的要求:
public interface ClassFilter{
boolean matches(Class clazz);
}
實現該接口的類決定了以參數傳遞 進來的類是否應該被通知。實現該接
口的類一般根據類名決定,但不一 定必須如此。
注意: 為減少系統負擔,盡量使用靜態切入點
2.定義切入點 spring提供了Advisor類。他把通知和切入點組合到一個對象中。更確切地說PointcutAdvisor提供了這些功 能
3.使用aspectJ開發
1.添加類庫:aspectjrt.jar和aspectjweaver.jar
2.添加aop schema.
3.定義xml元素:<aop:aspectj-autoproxy>
4.編寫java類,并用@Aspect注解成通知
AspectJ 支持 5 種類型的通知注解:
@Before: 前置通知, 在方法執行之前執行
@After: 后置通知, 在方法執行之后執行
@AfterRunning: 返 回通知, 在方法 返回結果之后執行
@AfterThrowing: 異 常通知, 在方法 拋出異常之后
@Around: 環繞通知, 圍繞著方法執行
配置成普通bean元素即可.
注意:
JoinPoint參數可訪問連接點細節,入方法名和參數等.
今天知識點蠻多的,對面試挺有用的,好好掌 握!