开发经验随笔程序员码农的世界

cglib动态代理

2019-05-26  本文已影响9人  山东大葱哥

概念及特点

组成

案例演示

  1. 引入cglib

        <dependencies>
            <dependency>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
                <version>2.2.2</version>
            </dependency>
        </dependencies>
    
  2. 业务实现类

    public class AccountServiceImpl {
        public void queryAccount() {
            System.out.println("查看账户...");
        }
    
        public void updateAccount() {
            System.out.println("修改账户...");
        }
    }
    
  3. 方法拦截器

    public class CglibProxy implements MethodInterceptor {
        private Object target;//业务类对象,供代理方法中进行真正的业务方法调用
    
        //相当于JDK动态代理中的绑定
        public Object getInstance(Object target) {
            this.target = target;  //给业务对象赋值
            Enhancer enhancer = new Enhancer(); //创建加强器,用来创建动态代理类
            enhancer.setSuperclass(this.target.getClass());  //为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
            //设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦截
            enhancer.setCallback(this);
            // 创建动态代理类对象并返回
            return enhancer.create();
        }
    
        // 实现回调方法
        @Override
        public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("预处理——————");
            proxy.invokeSuper(target, args); //调用业务类(父类中)的方法
            System.out.println("调用后操作——————");
            return null;
        }
    }
    
    1. 业务调用
      public class CglibProxyApplication {
          public static void main(String[] args) {
              AccountServiceImpl accountServiceImpl=new AccountServiceImpl();
              CglibProxy  cglib=new CglibProxy();
              AccountServiceImpl accountServiceProxy=(AccountServiceImpl)cglib.getInstance(accountServiceImpl);
              accountServiceProxy.queryAccount();
              accountServiceProxy.updateAccount();
          }
      }
    

两种动态代理对比

  1. 机制区别
  1. 效率对比
上一篇 下一篇

猜你喜欢

热点阅读