AOP学习笔记(一)—— 代理

来源:互联网 发布:机器视觉主流算法 编辑:程序博客网 时间:2024/06/08 20:17
1、什么是代理
     代理,或称为Proxy。意思就是你不用去做,别人代替你去处理。
2、静态代理
     以一个Hello World为例,代理类代替实现类执行say()。
     接口:
public interface Hello{     public void say();}
     实现类:
public class HelloImpl implements Hello{     @Override     public void say(){         System.out.println("Hello World");      }}
     代理类:
public class HelloProxy implements Hello(){         private Hello hello;          public HelloProxy(){         hello = new HelloImpl();      }     @Override     public void say(){          before();          hello.say();          after();     }     private void before(){         System.out.println("Before");      }     private void after(){         System.out.println("After");      }}
     测试类:
public class Test(){     public static void mian(String[] args){         HelloProxy helloProxy = new HelloProxy();         helloProxy.say();      }}
3、JDK动态代理
     JDK提供了动态代理技术,静态代理中的代理类需要实现被代理类的接口,这样在开发中必然会有大量的代理类,动态代理可以解决这个问题。
     接口类、实现类同上。
     代理类;
public class DynamicProxy implements InvocationHandler(){         private Object target; //被代理的类     public DynamicProxy(Object target){          this.target = target;     }      @Override     public Object invoke(Object proxy, Method method, Object[] params){          before();          Object result = method.invoke(target, params);          after();          return result;      }     private void before(){         System.out.println("Before");     }     private void after(){         System.out.println("After");     }     @SupperssWarnings("unchecked")     public <T> T getProxy(){          return (T) Proxy.newProxyInstance{//代理对象               target.getClass().getClassLoader();    //参数1:ClassLoader               target.getClass().getInterfaces();     //参数2:该实现类的所有接口               this;                                  //参数3:动态代理对象          };     }}
     测试类:
public class Test(){     public static void main(String[] args){                       DynamicProxy dynamicProxy = new DynamicProxy(new HelloImpl()); //动态代理对象          Hello helloProxy = dynamicProxy.getProxy();                    helloProxy.say();     }}
4、CGLIB动态代理
     JDK动态代理有限制,即被代理的对象必须实现某个接口,否则无法使用JDK自带的动态代理,因此只能使用一种功能更加强大的动态代理技术-CGLIB。
     接口类、实现类同上
     代理处理类:
public class CglibProxy implements MethodInterceptor {     private static CglibProxy instance = new CglibProxy();     private CglibProxy(){};     public static CglibProxy getInstance(){           return instance;     }     @Override     public Object intercept(Object obj, Method method, Object[] params, MethodProxy proxy) throws Throwable {           before();           Object result = proxy.invokeSuper(obj, params);           after();           return result;     }     @SuppressWarnings("unchecked")     public <T> T getProxy(Class<T> cls){           return (T) Enhancer.create(cls, this);     }     public void before(){           System.out.println("Before");     }     public void after(){           System.out.println("After");     }}
测试类:
public class Test {     public static void main(String[] args) {           Hello helloProxy = CglibProxy.getInstance().getProxy(HelloImpl.class);           helloProxy.say();     }}


原创粉丝点击