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

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();
     }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值