动态代理(JDK1.3+)

阅读更多

一:概念

nProxy:

Proxy作为clienttarget的中间人,可以做如Synchronization, Authentication, Remote Access, Lazy instantiation等工作[1].

nDynamic Proxy

Hard code一些proxy任务令人乏味,如果定义一个 InvocationHandler interface, coder给出implementation, 框架实现一个proxy, proxy将任务转移给handler处理,既灵活,又简洁.

二:JDK 1.3+ Dynamic Proxy参与者

(1)Client: 调用方

(2)Proxy:  Proxy.newProxyInstance动态生成的代理实例

(3)InvocationHandler: proxy将实际的代理动作交给此接口的实现完成

(4)Target: 被代理对象

三:JDK 1.3+ Dynamic Proxy的实作

(1) 实现InvocationHandler接口, 写出invoke方法体

(2) 生成代理实例, 通过代理实例调用

四:Sample

Handler:

  1. public class LogHandler implements InvocationHandler {   
  2.   
  3.      Object target = null;   
  4.   
  5.      public LogHandler(Object target) {   
  6.   
  7.          this.target = target;   
  8.   
  9.      }   
  10.   
  11.         
  12.   
  13.      public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {   
  14.   
  15.           System.out.println(m.getName() + " start!");   
  16.   
  17.           Object ret = m.invoke(target, args);   
  18.   
  19.           System.out.println(m.getName() + " end!");   
  20.   
  21.           return ret;   
  22.   
  23.      }   
  24.   
  25. }   

Client:

  1.      Rect rect = new Rect();   
  2.   
  3.      ClassLoader loader = IShape.class.getClassLoader();   
  4.   
  5.      IShape shape = (IShape)Proxy.newProxyInstance(loader,    
  6.   
  7.                                                     new Class[]{IShape.class},    
  8.   
  9.                                                     new LogHandler(rect));   
  10.   
  11.      shape.draw();   

五:已知应用

  (1) Spring AOP Framework

六:已知限制

  (1) 只能proxy interface, 不能proxy class. Spring AOP Framework的替代作法是用CGLib;

七:注释

  [1] 相对于Decorator来说,前者侧重于控制,后者侧重于增加新功能.

你可能感兴趣的:(Spring,AOP,JDK,框架,Access)