静态代理&动态代理

大兔子大兔子 提交于 2020-04-01 07:55:56

原文地址:http://blog.csdn.net/partner4java/article/details/7048879

 

静态AOP和动态AOP。 

静态代理: 
代理对象与被代理对象必须实现同一个接口。 
demo:

 
  1. package cn.partner4java.proxy.staticproxy;  
  2.   
  3.   
  4. /** 
  5. * 静态代理,统一接口 
  6. * @author partner4java 
  7. */  
  8. public interface IHello {  
  9.     /** 
  10.      * 可以带来的统一方法 
  11.      * @param name 
  12.      */  
  13.     public void hello(String name);  
  14. }  
 
  1. package cn.partner4java.proxy.staticproxy;  
  2.   
  3. /** 
  4. * 被代理的对象,需要借助代理对象加入日志 
  5. * @author partner4java 
  6. */  
  7. public class HelloSpeaker implements IHello {  
  8.   
  9.     public void hello(String name) {  
  10.         System.out.println("Hello " + name);  
  11.     }  
  12.   
  13. }  
 
  1. package cn.partner4java.proxy.staticproxy;  
  2.   
  3. /** 
  4. * 代理对象,给被代理对象添加日志 
  5. */  
  6. public class HelloProxy implements IHello {  
  7.       
  8.     private IHello iHello;  
  9.   
  10.     public HelloProxy(IHello iHello) {  
  11.         super();  
  12.         this.iHello = iHello;  
  13.     }  
  14.   
  15.   
  16.     public void hello(String name) {  
  17.         System.out.println("记录日志");  
  18.         iHello.hello(name);  
  19.     }  
  20.   
  21. }  
 
  1. package cn.partner4java.proxy.staticproxy;  
  2.   
  3. /** 
  4. * 调用 
  5. * @author partner4java 
  6. */  
  7. public class ProxyDemo {  
  8.   
  9.     public static void main(String[] args) {  
  10.         IHello iHello = new HelloProxy(new HelloSpeaker());  
  11.         iHello.hello("long");  
  12.     }  
  13.   
  14. }  






动态代理: 
动态代理区别于静态带来实现的地方在于织入过程是在运行时动态进行的。自己实现一般实现java.lang.reflect.InvocationHandler接口。 
例子:

 
  1. package cn.partner4java.proxy.dynamicproxy;  
  2.   
  3.   
  4. public interface IHello {  
  5.     public void hello(String name);  
  6. }  
 
  1. package cn.partner4java.proxy.dynamicproxy;  
  2.   
  3. /** 
  4. * 被代理的对象,需要借助代理对象加入日志 
  5. * @author partner4java 
  6. */  
  7. public class HelloSpeaker implements IHello {  
  8.   
  9.     public void hello(String name) {  
  10.         System.out.println("Hello " + name);  
  11.     }  
  12.   
  13. }  
 
  1. package cn.partner4java.proxy.dynamicproxy;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6.   
  7. /** 
  8. * 动态代理对象 
  9. * @author partner4java 
  10. */  
  11. public class LogHandler implements InvocationHandler {  
  12.   
  13.     private Object delegate;  
  14.       
  15.     public Object bind(Object delegate){  
  16.         this.delegate = delegate;  
  17.         return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),   
  18.                 delegate.getClass().getInterfaces(), this);  
  19.     }  
  20.     /** 
  21.      * 代理对象,这里面还可以改变原有的方法 
  22.      */  
  23.     public Object invoke(Object proxy, Method method, Object[] args)  
  24.             throws Throwable {  
  25.         Object result = null;  
  26.         try {  
  27.             System.out.println("添加日志");  
  28.             result = method.invoke(delegate, args);  
  29.         } catch (Exception e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.           
  33.         return null;  
  34.     }  
  35.   
  36. }  
 
  1. package cn.partner4java.proxy.dynamicproxy;  
  2.   
  3. /** 
  4. * 测试 
  5. * @author partner4java 
  6. */  
  7. public class ProxyDemo {  
  8.     public static void main(String[] args) {  
  9.         LogHandler logHandler = new LogHandler();  
  10.         IHello iHello = (IHello) logHandler.bind(new HelloSpeaker());  
  11.         iHello.hello("long");  
  12.     }  
  13. }  



------------------------------------------------------------------ 


利用ProxyFactory连接CGLIB简单实现AOP: 
加入包aopalliance.jar\cglib-nodep-2.1_3.jar 
demo:

 
  1. package cn.partner4java.proxy.proxyfactory;  
  2.   
  3. /** 
  4. * 被代理的对象 
  5. * @author partner4java 
  6. */  
  7. public class MessageWriter {  
  8.     public void writeMessage(){  
  9.         System.out.println("world!");  
  10.     }  
  11. }  
 
  1. package cn.partner4java.proxy.proxyfactory;  
  2.   
  3. import org.aopalliance.intercept.MethodInterceptor;  
  4. import org.aopalliance.intercept.MethodInvocation;  
  5.   
  6. /** 
  7. * 装饰者<br/> 
  8. * MethodInterceptor接口是对方法调用连接点实现包围通知的AOP联盟标准接口 
  9. * @author partner4java 
  10. */  
  11. public class MessageDecorator implements MethodInterceptor{  
  12.   
  13.     public Object invoke(MethodInvocation invocation) throws Throwable {  
  14.         System.out.print("Hello ");  
  15.         Object retVal = invocation.proceed();  
  16.         return retVal;  
  17.     }  
  18.   
  19. }  
 
  1. package cn.partner4java.proxy.proxyfactory;  
  2.   
  3. import org.springframework.aop.framework.ProxyFactory;  
  4.   
  5. /** 
  6. * 调用组装 
  7. * 这里最重要的部分是我们使用ProxyFactory来创建一个目标对象代理,同时织入通知  
  8. * @author partner4java 
  9. */  
  10. public class HelloWorldWeaver {  
  11.   
  12.     public static void main(String[] args) {  
  13.         //目标  
  14.         MessageWriter target = new MessageWriter();  
  15.           
  16.         //create the proxy  
  17.         ProxyFactory proxyFactory = new ProxyFactory();  
  18.           
  19.         proxyFactory.addAdvice(new MessageDecorator());  
  20.         proxyFactory.setTarget(target);  
  21.           
  22.         //获取返回被代理的目标  
  23.         MessageWriter proxy = (MessageWriter) proxyFactory.getProxy();  
  24.           
  25.         target.writeMessage();  
  26.         System.out.println("---");  
  27.         proxy.writeMessage();  
  28. //      后台打印:  
  29. //      world!  
  30. //      ---  
  31. //      World world!  
  32.     }  
  33.   
  34. }  
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!