AOP術語
- 連接點:被我們攔截到的那個方法
- 切面的切點:指定希望在程序流中攔截的連接點
- 切面的通知類型:
- 1)前置:在連接點之前
- 2)後置:在連接點正常完成之後
- 3)異常:在方法拋出異常退出時
- 4)最終:2)後置 + 3)異常
- 5)環繞:可改變參數和返回結果,容易忘記執行原始的方法,invocation.proceed()
使用AOP:基於註解
- 1)定義切面:MarinlogService接口,是一個註解
- MarinlogUser類,使用@Aspect修飾
- 切入點和切入類型
- 連接點:
- MarinlogUser類中
代理
public static void main(String[] args){
RealPerson xiaoMing=new RealPerson();
ProxyPerson proxy=new ProxyPerson(xiaoMing);
proxy.sentGigt(1);
}
public interface abstractPerson {
public void sentGigt(int toPersonId);
}
public class RealPerson implements abstractPerson{
@Override
public void sentGigt(int toPersonId){
Print.print(" 被代理的類");
}
}
public class ProxyPerson implements abstractPerson{
public RealPerson real;
public ProxyPerson(RealPerson real){
this.real=real;
}
@Override
public void sentGigt(int toPersonId){
real.sentGigt(toPersonId);
}
}
- 靜態代理:與反射無關,運行前,代理類的class 文件已生成,編譯期間進行靜態織入
- 動態代理:反射生成代理類的字節碼
- 定義proxyHandler,實現InvocationHandler接口,持有被代理接口的引用,重寫invoke()
- Proxy.newProxyInstance(加載器,接口列表,proxyHandler)生成代理類對象,
- 繼承了Proxy類,實現了被代理者的所有接口,final
- cglib(代理類)
- 若被代理者沒有實現任何接口,創建cglib代理,使用ASM(java字節碼處理框架)
- 可強制 < aop:aspectj-autoproxy proxy-target-class=”true”/>
AOP介紹
AOP是對OOP思想的補充和完善,OOP引進”抽象-封裝-繼承-多態”等概念,進行由上到下的抽象和層次封裝
- 但是具體細粒度到每個事物內部的情況,OOP就顯得無能爲力了,比如日誌功能。
- 日誌代碼往往水平地散佈在所有對象層次當中,與它所散佈到的對象的核心功能無關。
- 導致了大量代碼的重複,不利於各個模塊的重用
橫切技術
- 剖解開封裝的對象內部,將公共行爲封裝成一個獨立的模塊(切面)
- 又能將剖開的切面復原,融入核心業務邏輯中。這樣,能便於之後橫切功能的編輯和重用