CGLIB动态代理

来源:互联网 发布:六壬排盘软件 编辑:程序博客网 时间:2024/06/06 01:49
/** * 普通类  未实现接口的类  如果实现了接口的类默认使用JDK动态代理 * @author zzcy * */public class Cat {    public void add(){        System.out.println("我养了一只猫。");    }}/** * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 * 因为是继承,所以该类或方法最好不要声明成final  * @author zzcy * */public class CGLibProxy implements MethodInterceptor{    //需要代理的真实对象    private Object targetObject;    //创建代理对象    public Object createProxyObject(Object obj) {            this.targetObject = obj;            //创建加强器,用来创建动态代理类          Enhancer enhancer = new Enhancer();          //为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)        enhancer.setSuperclass(this.targetObject.getClass());            //设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要        //实现intercept()方法进行拦截        enhancer.setCallback(this);            // 创建动态代理类对象并返回        Object proxyObj = enhancer.create();            return proxyObj;    }     public void beforeM(){        System.out.println("预处理···");    }    public void afterM(){        System.out.println("处理后···");    }    //回调方法    @Override    public Object intercept(Object object, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {        beforeM();        //调用业务类(父类中)的方法        Object result = methodProxy.invokeSuper(object, arg);        //System.out.println(method.getName());        //System.out.println(methodProxy.getSuperName());        afterM();        return result;    }    public static void main(String[] args) {        Cat cat = new Cat();        CGLibProxy cgLibProxy = new CGLibProxy();        Cat catProxy = (Cat) cgLibProxy.createProxyObject(cat);        catProxy.add();    }    /*JDK动态代理和CGLIB字节码生成的区别    (1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类        JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的        业务实现类对象以及方法名 ,动态地创建了一个代理类的class文件并被字节码引擎执行,        然后通过该代理类对象进行方法调用。    (2)CGLIB是针对类实现代理,主要是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理        因为采用的是继承,所以不能对final修饰的类进行代理*/    //  这里需要注意的是实现MethodIntercetor接口,必须导入cglib-nodep-x.x_x.jar这个包。    //  CGLib是针对类来实现代理的,他的原理是对指定的目标生成一个子类,并覆盖其中方法实现增强,    //  但因为采用的是继承,所以不能对final修饰的类进行代理。    //如何强制使用CGLIB实现AOP?    //(1)添加CGLIB库,SPRING_HOME/cglib/*.jar    //(2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>}

JDK动态代理文章请点击:
http://blog.csdn.net/renli2549/article/details/78490508

原创粉丝点击