动态代理(JDK1.3+)

一:概念<o:p></o:p>

nProxy:

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

nDynamic Proxy

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

二:JDK 1.3+ Dynamic Proxy参与者<o:p></o:p>

(1)Client: 调用方<o:p></o:p>

(2)Proxy:  Proxy.newProxyInstance动态生成的代理实例<o:p></o:p>

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

(4)Target: 被代理对象<o:p></o:p>

三:JDK 1.3+ Dynamic Proxy的实作<o:p></o:p>

(1) 实现InvocationHandler接口, 写出invoke方法体<o:p></o:p>

(2) 生成代理实例, 通过代理实例调用<o:p></o:p>

四:Sample<o:p></o:p>

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

<o:p>

六:已知限制

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

</o:p>

七:注释<o:p></o:p>

  [1] 相对于Decorator来说,前者侧重于控制,后者侧重于增加新功能.<o:p></o:p>

你可能感兴趣的:(spring,AOP,jdk,框架,Access)