1. 程式人生 > 實用技巧 >Sping的Aop

Sping的Aop

1.Spring 的 AOP 簡介

1.1 什麼是 AOP

AOP 為 Aspect Oriented Programming 的縮寫,意思為面向切面程式設計,是通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。

AOP 是 OOP 的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,
從而使得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。

aop就是在不改變某個類的方法本身的程式碼結構上增加其他功能, 也就是python的裝飾器,

1.2 AOP 的作用及其優勢

作用:在程式執行期間,在不修改原始碼的情況下對方法進行功能增強

優勢:減少重複程式碼,提高開發效率,並且便於維護

1.3 AOP 的底層實現

實際上,AOP 的底層是通過 Spring 提供的的動態代理技術實現的。在執行期間,Spring通過動態代理技術動態的生成代理物件,代理物件方法執行時進行增強功能的介入,在去呼叫目標物件的方法,從而完成功能的增強。

1.4 AOP 的動態代理技術

常用的動態代理技術

JDK 代理 : 基於介面的動態代理技術 

cglib 代理:基於父類的動態代理技術

1.5 JDK 的動態代理

①目標類介面

public interface
TargetInterface { public void method(); }

②目標類

public class Target implements TargetInterface {
    @Override
    public void method() {
        System.out.println("Target running....");
    }
}

③動態代理程式碼

Target target = new Target(); //建立目標物件
//建立代理物件
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass()
.getClassLoader(),target.getClass().getInterfaces(),
new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("前置增強程式碼..."); Object invoke = method.invoke(target, args); System.out.println("後置增強程式碼..."); return invoke; } } );

④ 呼叫代理物件的方法測試

// 測試,當呼叫介面的任何方法時,代理物件的程式碼都無序修改
proxy.method();

1.6 cglib 的動態代理

①目標類

public class Target {
    public void method() {
        System.out.println("Target running....");
    }
}

②動態代理程式碼

Target target = new Target(); //建立目標物件
Enhancer enhancer = new Enhancer();   //建立增強器
enhancer.setSuperclass(Target.class); //設定父類
enhancer.setCallback(new MethodInterceptor() { //設定回撥
    @Override
    public Object intercept(Object o, Method method, Object[] objects, 
    MethodProxy methodProxy) throws Throwable {
        System.out.println("前置程式碼增強....");
        Object invoke = method.invoke(target, objects);
        System.out.println("後置程式碼增強....");
        return invoke;
    }
});
Target proxy = (Target) enhancer.create(); //建立代理物件

③呼叫代理物件的方法測試

//測試,當呼叫介面的任何方法時,代理物件的程式碼都無序修改
proxy.method();

1.7 AOP 相關概念

Spring 的 AOP 實現底層就是對上面的動態代理的程式碼進行了封裝,封裝後我們只需要對需要關注的部分進行程式碼編寫,並通過配置的方式完成指定目標的方法增強。

在正式講解 AOP 的操作之前,我們必須理解 AOP 的相關術語,常用的術語如下:

- Target(目標物件):代理的目標物件

- Proxy (代理):一個類被 AOP 織入增強後,就產生一個結果代理類

- Joinpoint(連線點):所謂連線點是指那些被攔截到的點。在spring中,這些點指的是方法,因為spring只支援方法型別的連線點

- Pointcut(切入點):所謂切入點是指我們要對哪些 Joinpoint 進行攔截的定義

- Advice(通知/ 增強):所謂通知是指攔截到 Joinpoint 之後所要做的事情就是通知

- Aspect(切面):是切入點和通知(引介)的結合

- Weaving(織入):是指把增強應用到目標物件來建立新的代理物件的過程。spring採用動態代理織入,而AspectJ採用編譯期織入和類裝載期織入

1.8 AOP 開發明確的事項

1.8 AOP 開發明確的事項

.