CGLIB代理就这么简单

CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如spring AOP和dynaop,为他们提供方法的interception(拦截)。CGLIB通过子类的方式实现对类的代理


1、maven导入依赖

<dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib-nodep</artifactId>
      <version>2.2</version>
    </dependency>

2、demo

被代理类

/**
 * Created by shuangjun.yang on 2016/5/4.
 * 被代理类,
 */
public class DBCurd {
    public void create() {
        System.out.println("create method");
    }

    public String select() {
        System.out.println("select method");
        return "yang";
    }
}

方法拦截类,必须实现MethodInterceptor

/**
 * Created by shuangjun.yang on 2016/5/4.
 * 方法拦截操作
 */
public class MethodInter implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        long startTime = System.currentTimeMillis();
        //拦截开始,输出 提示符和方法名
        System.out.println("拦截开始" + method.getName());
        //调用被代理方法,cglib通过创建子类实现代理,所以用invokeSuper
        Object object = methodProxy.invokeSuper(o, objects);
        //拦截结束
        long endTime = System.currentTimeMillis();
        System.out.println("=================拦截结束,消耗时间为:" + (endTime - startTime) + "毫秒");
        return object;
    }
}

客户端代码如下

/**
 * Created by shuangjun.yang on 2016/5/4.
 * 客户端操作
 */
public class TestCglib {
    public static void main(String[] arggs){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(DBCurd.class);       //通过设置父类为DBCurd实现代理
        enhancer.setCallback(new MethodInter());    //设置callback,实现代理
        DBCurd dbCurd = (DBCurd)enhancer.create();  //创建代理对象
        dbCurd.create();                            //调用create方法
        System.out.println(dbCurd.select());        //调用select方法并输出返回值
    }
}

你可能感兴趣的:(AOP,cglib)