AOP动态代理之CGLIB代理

Posted 花式编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP动态代理之CGLIB代理相关的知识,希望对你有一定的参考价值。

前言


JDk动态代理的使用非常简单,但它还有一定的局限性--使用动态代理的对象必须实现一个或多个接口,如果要对没有实现接口的类进行代理,那么可以使用CGLIB代理。

CGLIB是什么

CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它爱用飞翔底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强,在Sprnig的核心包中已经集成了CGLIB所需要的包,所以开发中不需要另外导入JAR包。

实战

1.创建目标类  

public class UserDao {
    public void addUser(){
        System.out.println("添加用户");
    }
    public void deleteUser(){
        System.out.println("删除用户");
    }
}

2.创建切面类

//切面类:可以存在多个通知Advice(即增强的方法)
public class MyAspect {
    public void check_Permission(){
        System.out.println("模拟检查权限");
    }
    public void log(){
        System.out.println("模拟记录日志");
    }
}


3.创建代理类CglibProxy  

package com.aop.cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibProxy implements MethodInterceptor {
    //代理方法
    public Object createProxy(Object target){
        //创建一个动态类对象
        Enhancer enhancer = new Enhancer();
        //确定需要增强的类,设置其父类
        enhancer.setSuperclass(target.getClass());
        //添加回调函数
        enhancer.setCallback(this);
        //返回创建的代理类
        return  enhancer.create();
    }

    /**
     *
     * @param proxy  CGlib根据指定父类生成的代理对象
     * @param method  拦截的方法
     * @param args   拦截方法的参数数组
     * @param methodProxy  方法的代理对象,用于执行父类的方法
     * @return
     * @throws Throwable
     */

    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //创建切面类对象
        MyAspect myAspect = new MyAspect();
        //前增强
        myAspect.check_Permission();
        //目标方法执行
        Object obj = methodProxy.invokeSuper(proxy,args);
        //后增强
        myAspect.log();
        return obj;
    }
}

上面代理类CglibProxy首先创建了一个动态类对象Enhancer,它是CGLIB的核心类;然后调用了Enhancer类的setSuperclass()方法来确定目标对象;接下类调用了setCallback()放天假回调函数,其中的this代表的 就是代理类CglibProxy本身;最后通过return语句将创建的代理类对象返回,intervept()方法会在执行目标方法时被调用,方法运行时将会执行切面类的增强方法。

4.创建测试类

package com.aop.cglib;

public class CglibTest {
    public static void main(String[] args) {
        //创建代理类
        CglibProxy cglibProxy = new CglibProxy();
        //创建目标对象
        UserDao useDao = new UserDao();
        //获取增强后的目标对象
        UserDao userDao1 = (UserDao) cglibProxy.createProxy(useDao);
        //执行方法
        userDao1.addUser();
        userDao1.deleteUser();
    }
}

运行结果

推荐阅读:




如果看了有所帮助,转发点赞分享给那些还在迷茫的人吧。


AOP动态代理之CGLIB代理

 喜欢记得来个赞

也可点击后台来撩我添加小编微信

以上是关于AOP动态代理之CGLIB代理的主要内容,如果未能解决你的问题,请参考以下文章

Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)

Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现

Spring读源码系列之AOP--06---AopProxy===>spring使用jdk和cglib生成代理对象的终极奥义

动态代理之 cglib 实现

Spring AOP:CGLIB动态代理

Spring AOP详解 JDK动态代理CGLib动态代理