zoukankan      html  css  js  c++  java
  • cglib动态代理

    cglib动态代理相比于JDK动态代理的的优秀之处在于它是够实现非接口的动态代理,且提供了多种回调方式,这里就将callbackFilter和MethodInterceptor两种

    被代理类

    package com.yangpeng.proxy;
    
    public class BookPorxyImpl {
        public void addBook() {
            System.out.println("增加图书的普通放方法");
        }
        public void addBall() {
            System.out.println("增加Ball的普通放方法");
        }
    
    }

    提供统一的回调方式,cglib的主要回调是MethodInterceptor接口,和用于创建动态代理的Enhancer类

    package com.yangpeng.proxy;
    
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class BookProxyLib implements MethodInterceptor{
        private Object target;
    //这一个方法你也可以不写在这里,这里只是采用Enhancer对传入的原对象做一个包装,返回一个代理类
    public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); enhancer.setCallback(this); return enhancer.create(); } //接口实现 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("事务开始"); proxy.invokeSuper(obj, args); System.out.println("事务结束"); return null; } }

    另外一种回调:

    package com.yangpeng.proxy;
    
    import java.lang.reflect.Method;
    
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    public class BookProxyLib2 implements MethodInterceptor{
    
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("不错哦!");
            return null;
        }
    
    }

    CallbackFilter:

    package com.yangpeng.proxy;
    
    import java.lang.reflect.Method;
    
    import com.sun.xml.internal.ws.api.message.AttachmentEx.MimeHeader;
    
    import net.sf.cglib.proxy.CallbackFilter;
    
    public class BookCallBackFilter implements CallbackFilter {
    
        /**
         * 方法返回的值时和callback回调接口返回的数组一一对应的数组下标
         */
        public int accept(Method method) {
            String name =method.getName();
            if("addBook".equals(name)) {
                return 0;
            }
            return 1;
        }
    
    }

    测试:

     


    import
    com.sun.org.apache.bcel.internal.generic.NEW; import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.NoOp; public class TestLib { public static void main(String[] args) { proxy(); callbackProxy(); }
    public static void proxy() { System.out.println("---------------统一采用MethodInterceptor,所有的业务都经过同一个intercept调用---------"); BookProxyLib cglib = new BookProxyLib(); BookPorxyImpl bookcglib = (BookPorxyImpl) cglib.getInstance(new BookPorxyImpl()); bookcglib.addBook(); bookcglib.addBall(); System.out.println("-------------------------------------------------------------------------------"); }
    //callback Proxy
    public static void callbackProxy() { System.out.println("----------------采用callbackFilter对不同方法实现不同代理逻辑------------------------------"); BookPorxyImpl bookImpl = new BookPorxyImpl(); Enhancer enhancer = new Enhancer(); // 设置代理目标 enhancer.setSuperclass(bookImpl.getClass());
    //这里声明一个Callback数组,此处对bookProxyImpl的两个方法分别做使用了两个回调, Callback[] callbacks
    = new Callback[] {new BookProxyLib(),new BookProxyLib2(),NoOp.INSTANCE }; enhancer.setCallbacks(callbacks); enhancer.setCallbackFilter(new BookCallBackFilter()); BookPorxyImpl impl = (BookPorxyImpl) enhancer.create(); impl.addBall(); impl.addBook(); } }
    好好生活,天天向上
  • 相关阅读:
    让某个软件无法被操作员最小化(C#演示)
    SharpGL学习笔记(四) 正射投影
    SharpGL学习笔记(三) 投影变换和视点变换
    盈动线性绝对值编码器(光栅尺)的测试记录
    用基恩仕7060激光测试电池宽度信息
    在winform上内嵌入其它的程序
    AD采样模块采集带模拟量真空表值的实验
    SharpGL学习笔记(二) 模型变换(几何变换)
    git add 错误修改方法
    Reactjs 的 PropTypes 使用方法
  • 原文地址:https://www.cnblogs.com/linchongatfirst/p/10990429.html
Copyright © 2011-2022 走看看