面向橫切面程式設計(Aspect Oriented Programming)。
什麼是動態代理?
動態代理就是在實現階段不用關心代理誰,而在執行階段才指定代理哪個物件。具體說明動態代理是根據被代理的介面生成所有的方法,也就是說給定一個介面,動態代理會宣稱“我已經實現該介面的所有方法了”。
面向切面變成(AOP),其核心就是採用了動態代理機制。AOP程式設計沒有使用什麼新的技術,但是它對我們的設計、編碼有非常大的影響,對於日誌、事務、許可權等都可以在系統設計階段不用考慮,而在設計後通過AOP的方式切過去。
代理思路:
動態代理實現代理的職責,業務邏輯Subject實現相關的邏輯功能,兩者之間沒有必然的相互耦合的關係。通知Advice從另一個切面切入,最終在高層模組也就是Client進行耦合,完成邏輯的封裝任務。
抽象主題
public interface Subject {
// 業務操作
public void doSomething(String str);
}
其中的doSomething是一種標識方法,可以有多個邏輯處理方法。
真實主題
public class RealSubject implements Subject {
// 業務操作
public void doSomething(String str) {
System.out.println("do something!--->" + str);
}
}
動態代理的Handler類
public class MyInvocationHandler implements InvocationHandler {
// 被代理的物件
private Object target = null;
// 通過建構函式傳遞一個物件
public MyInvocationHandler(Object _obj) {
this.target = _obj;
}
// 代理方法
public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
// 執行被代理的方法
return method.invoke(this.target , args);
}
}
動態代理類
public class DynamicProxy<T> {
public static <T> T newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandle h) {
// 尋找JoinPoint連線點,AOP框架使用後設資料定義
if(true) {
// 執行一個前置通知
(new BeforeAdvice()).exec();
}
// 執行目標,並返回結果
return (T)Proxy.newProxyInstance(loader, interface , h);
}
}
該方法時重新生成了一個物件,為什麼要重新生成?你要使用代理,注意c.getInterfaces()這句話,這是非常有意思的一句話,是說查詢到該類的所有介面,然後實現介面的所有方法。當然了,方法都是空的,由誰具體負責接管呢?是new MyInvocationHandler(_Obj)這個物件。於是 我們知道一個類的動態代理類時這樣的一個類,由InvocationHandler的實現類實現所有的方法,由其invoke方法接管所有方法的實現。
通知介面及實現
public interface IAdvice {
// 通知只有一個方法,執行即可
}
public class BeforeAdvice implements IAdivce {
public void exec() {
System.out.println("我是前置通知,我被執行了!");
}
}
具體業務的動態代理
public class SubjectDynamicProxy extends DynamicProxy {
public static <T> newProxyInstance(Subject subject) {
// 獲得ClassLoader
ClassLoader loader = subject.getClass().getClassLoader();
// 獲得介面陣列
Class<?> classes = subject.getClass().getInterfaces();
// 獲得handler
InvocationHandler handler = new MyInvocationHandler(subject);
return newProxyInstance(loader, classes , handler);
}
}
場景類
public class Client {
public static void main(Stirng[] args) {
// 定義一個主題
Subject subject = new RealSubject();
// 定義主題的代理
Subject proxy = SubjectDynamicProxy.newProxyInstance(subject);
// 代理的行為
proxy.doSomething("Finish");
}
}
動態代理的主要意圖就是解決我們常說的“審計”問題,也就是橫切面程式設計,在不改變我們已有的程式碼結構的情況下增強或控制物件的行為。
注意:要實現動態代理的首要條件是:被代理類必須實現一個介面,回想一下前面的分析吧,當然了,現在也有很多技術如CGLIB可以實現不需要介面也可以實現動態代理的方式。
相關文章
- 面向切面程式設計 ( Aspect Oriented Programming with Spring )程式設計Spring
- iOS 如何實現 Aspect Oriented Programming (上)iOS
- iOS 如何實現 Aspect Oriented Programming (下)iOS
- iOS 如何實現Aspect Oriented Programming (上)iOS
- iOS 如何實現Aspect Oriented Programming (下)iOS
- AOP 面向切面程式設計程式設計
- AOP(面向切面程式設計)程式設計
- 面向切面程式設計AOP程式設計
- 程式設計思想 面向切面程式設計程式設計
- Java 面向切面程式設計AOPJava程式設計
- AOP--面向切面程式設計程式設計
- 設計模式之面向切面程式設計AOP設計模式程式設計
- Android AOP面向切面設計程式設計Android程式設計
- 前端js面向切面程式設計(AOP)前端JS程式設計
- React Native面向切面程式設計React Native程式設計
- Android面向切面程式設計(AOP)Android程式設計
- Butler - TOP(Table-Oriented Programming)面向表程式設計的資料庫開發框架程式設計資料庫框架
- 使用面向 Aspect 的程式設計改進模組性程式設計
- aop面向切面程式設計的實現程式設計
- 四、Spring-面向切面程式設計Spring程式設計
- Java中的面向切面程式設計(AOP)Java程式設計
- 前端解讀面向切面程式設計(AOP)前端程式設計
- Spring之AOP面向切面程式設計Spring程式設計
- 面向切面程式設計和依賴注入程式設計依賴注入
- OOP物件導向程式設計(Object-Oriented Programming)概述OOP物件程式設計Object
- 在Javascript中進行面向切面程式設計JavaScript程式設計
- 01.AOP(AspectOrientatedProgramming面向切面程式設計)程式設計
- 面向切面程式設計之瘋狂的 Aspects程式設計
- Spring AOP——Spring 中面向切面程式設計Spring程式設計
- Spring AOP(面向切面程式設計)是什麼?Spring程式設計
- Spring理論基礎-面向切面程式設計Spring程式設計
- Python裝飾器與面向切面程式設計Python程式設計
- 手寫Spring---AOP面向切面程式設計(4)Spring程式設計
- 手寫Spring---AOP面向切面程式設計(3)Spring程式設計
- Spring 面向切面程式設計AOP 詳細講解Spring程式設計
- Day67 Spring AOP(面向切面程式設計) 和代理設計模式Spring程式設計設計模式
- iOS開發 面向切面程式設計之 Aspects 原始碼解析iOS程式設計原始碼
- JS實現AOP 面向切面程式設計 (裝飾者模式)JS程式設計模式