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();
    }
}

运行结果
image

扫描关注下面二维码获得更多有用的资源!
这里写图片描述

你可能感兴趣的:(spring)