1. 程式人生 > >4.AOP原理模擬

4.AOP原理模擬

實現接口 color jar getmethod 面向對象 原因 user 方式 ins

AOP Aspect-Oriented-Programming 面向切面編程

  a)是對面向對象的思維方式的有力補充

好處:可以動態的添加和刪除在切面上的邏輯而不影響原來的執行代碼

  a)Filter

  b)Struts2 的 interceptor

Spring AOP的實現依賴於 Java的 Proxy 類

  1.首先創建目標對象(需要被代理的對象)(即該對象的方法的執行前後有業務邏輯的添加)

  UserService service = new UserServiceImpl();

  2.創建一個 InvocationHandler,在這個InvocationHandler中,可以指明需要添加的業務邏輯

  Interceptor interceptor = new Interceptor (); //public class Interceptor implements InvocationHandler

 

  3.將目標對象放到 InvocationHandler中,由InvocationHandler 來執行整個業務(添加的業務 + 原來的業務)

  interceptor.setTarget(service);

  

  4.代理對象的創建,在創建時,會參考被代理對象實現的接口,代理對象也去實現這些接口

  另外,每個代理裏面帝實有 InvocationHandler 對象存在的

  UserService userProxy = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), interceptor);

  如上:userProxy 其實是一個實現了UserService接口的 Proxy對象,

  //可能這也是為什麽 Proxy.newProxyInstance 只能由 接口去接收的原因吧

註:!!一個類 如果在實現了接口的情況下,來為這個類創建一個代理對象時,實現代理時,用jdk 自帶的 Proxy 和 InvocationHandler,來幫你產生代理

  這個類如果沒有實現接口,那麽它會直接用操作二進制碼的類庫(cglib.jar)來幫你產生代理的代碼

  5.使用代理對象,調用add方法(因為userProxy 是實現了UserService接口的,所以是可以調用的)

    userProxy.add();

    //5.1 一旦代理對象調用 add方法,代理對象會 反射Method m = UserDAO.getClass.getMethod 拿到add方法對應的Method對象

    //5.2 然後調用InvocationHandler 中的 invoke (Object proxy, Method method, Object[] args)

  代理對象 add 方法的調用 實際上就是讓 InvocationHandler 去處理了,代理對象負責拿到執行方法必要的條件

InvocationHandler 的實現類

 1 public class Interceptor implements InvocationHandler {
 2     
 3     //被代理對象
 4     private Object target;
 5     
 6     public Object getTarget() {
 7         return target;
 8     }
 9     public void setTarget(Object target) {
10         this.target = target;
11     }
12     
13     public Object invoke(Object proxy, Method method, Object[] args)
14             throws Throwable {
15         System.out.println("方法要執行了");
16         //調用被代理對象的方法,指明調用哪個被代理對象 ,用到了哪些參數
17         method.invoke(target, args);
18         return null;
19     }
20 
21 }

  

感覺像是在 被代理的對象上面 先包了一層 InvocationHandler,然後在InvocationHandler上再包了一層 Proxy

  然後調用的時候,先去調用Proxy 的 add方法,調用的時候可以拿到執行add方法所必須的條件參數

  然後內部再去調用 InvocationHandler 的invoke方法,在InvocationHandler 的invoke方法裏面,

  有新添加的業務邏輯和 本來要執行方法,通過這個invoke方法的執行,來完成動態的添加和刪除在切面上的邏輯,

  而不影響原來的執行代碼

為什麽要分 Proxy 和 InvocationHandler

  因為InvocationHandler 獲取不到 執行原本的方法 所需要的參數,必須要通過Proxy 給它

  Proxy 又不能完成業務邏輯的增加和刪除,所以 各司其職

4.AOP原理模擬