• 关于动态代理


    ---恢复内容开始---

      动态代理是相对于静态代理来说的,相比于后者,前者能够增强代码的复用性,可以处理一类对象。

      动态代理两种分别是JDK动态代理和Cglib动态动态代理:

      前者要求代理类对象和委托类实现相同的接口,否则不能生成代理对象,而且指定方法较为麻烦。代码如下:

      public class Proxy{

        //获取代理对象的静态方法

        public static Object getProxy(final Object target , final TranactionManager tx){

        //利用target参数获取类加载器,真实对象类上的接口和指定接口,创建代理对象     

        Object  proxy = Proxy.NewInstance(target.getClass().getClassLoader , target.getClass().getInterfaces() , new InvocationHandler( ){

             //当与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法

              @override

              public Object invoke(Object proxy,Method method , Object[] args) throws throwable{

            tx.begin();

            method.invoke(target,args);

            tx.commit();

            } 

          });

    return  proxy;   

        }

      }

      后者不管有无接口都可以实现代理对象,生成的代理对象时目标对象的子类

    public class DynamicProxy {
     
     //获取代理对象
     public static Object getProxy(final Object target,final TranactionManager tx){
      
      //增强器   底层操作的是二进制码
      Enhancer enhancer = new Enhancer();
      
      //设置接口
      enhancer.setInterfaces(target.getClass().getInterfaces());
      
      //设置父类
      enhancer.setSuperclass(target.getClass());

      //创建代理对象
      return enhancer.create();
      
      //设置回调  代理对象调用方法时,此方法进行拦截,进入到此方法中

    //当与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
      enhancer.setCallback(new MethodInterceptor() { 
       @Override
       public Object intercept(Object proxy, Method method, Object[] args,
         MethodProxy methodProxy) throws Throwable {
        
        tx.begin();
        //调用真实对象的方法
        Object result = method.invoke(target, args);
        tx.commit();
        
        return result;
       }
      });
      

      
     }
    }

      

    ---恢复内容结束---

  • 相关阅读:
    发现IDEA两个超级好用的工具
    事务的传播属性
    Java 单元测试PowerMockito
    Spirng源码学习 第一天
    2021年 每日打卡
    Spring源码调试环境搭建成功
    practice
    学习进度表
    报数
    负二进制转换
  • 原文地址:https://www.cnblogs.com/sxpy-lj/p/7076210.html
Copyright © 2020-2023  润新知