Spring面向切面编程(AOP)原理二之使用Cglib实现动态代理

上面我们已经介绍了使用JDK实现动态代理的过程

Spring面向切面编程(AOP)原理一之使用JDK实现动态代理

除了可以使用JDK实现动态代理之外,还可以使用Cglib实现动态代理。

在Spring框架内部的AOP(面向切面编程)就是会自动切换JDK和Cglib实现动态代理。

上面已经介绍了JDK使用条件是必须要有接口,但是Cglib就没有这个条件。

Cglib是第三方平台的,所以使用之前需要导入jar包,在Sping核心jar包里面已经导入了Cglib的jar包。

《Spring面向切面编程(AOP)原理二之使用Cglib实现动态代理》

下面介绍使用Cglib实现动态代理的过程

创建一个类(需要被代理的)

public class UserDao {
    public void save(){
        System.out.println("保存操作");
    }
    public void delete(){
        System.out.println("删除操作");
    }
}

代理过程

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

//使用cglib实现动态代理,不需要有接口
public class UserDaoCglibProxy implements MethodInterceptor {

    //提供创建代理对象的方法,核心就是创建的代理对象是原本对象的子类
    public UserDao createCglibProxy(UserDao userdao){

        //1.创建核心类
        Enhancer enhancer = new Enhancer();
        //2.设置父类,表明继承关系,设置完成就会自动的创建好了子类
        enhancer.setSuperclass(userdao.getClass());
        //3.方法回调,以实现MethodInterceptor接口的方式回调
        enhancer.setCallback(this);
        //4.拿到子类,就是代理对象
        UserDao user = (UserDao)enhancer.create();

        return user;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects,
                            MethodProxy methodProxy) throws Throwable {

        /*//调用父类方法之前,添加额外功能,实现动态代理
        check();*/

        //筛选某个方法动态代理
        if("save".equals(method.getName())){
            check();
        }

        //让子类调用父类的方法
        Object invokeSuper = methodProxy.invokeSuper(o, objects);
        return invokeSuper;
    }

    //定义需要被增强(代理)的方法
    public void check(){
        System.out.println("保存之前进行校验");
    }
}

编写测试类

import org.junit.Test;

public class UserDaoTest {

    UserDao userDao = new UserDao();
    UserDaoCglibProxy userDaoCglibProxy = new UserDaoCglibProxy();

    @Test
    public void Test(){
        UserDao cglibProxy = userDaoCglibProxy.createCglibProxy(userDao);
        cglibProxy.delete();
        cglibProxy.save();
    }
}

运行结果

删除操作
保存之前进行校验
保存操作

Process finished with exit code 0

可以看到已经实现了对save()方法实现了增强,这就是动态代理的过程。

使用Cglib动态代理的原理就是,创建原本类的子类,这个子类就是代理对象,然后子类可以调用父类的方法,也可以有自己的方法(也就是实现了方法的增强)。

使用Cglib动态代理的过程,已经在代码里面做了详细的步骤注释,可以对照理解。

但是在Spring框架中,使用AOP并不需要写出动态代理的过程,因为Spring框架已经对动态代理的过程进行了封装,所以只需要在配置文件里面配置一些必要的参数即可,这里的两篇介绍主要是为了理解AOP动态代理其中的原理、过程,加深理解学习。

    原文作者:AOP
    原文地址: https://blog.csdn.net/shijiujiu33/article/details/84201185
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞