动态代理----cglib

CGLIB动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类
所用从上面可以知道CGLIB也不能代理private方法,也为CGLIB是要生产你的业务类的子类作为代理类,一旦你的业务类中的方法有private的话,代理类就不能继承业务类,也就是不能进行增强,不能进行代理
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
从这我们也知道了CGLIB可以代理类了,CGLIB通过生成业务类的子类作为代理类,子类的话肯定是通过继承实现的,所以就没有单继承的限制了,而不是向JDK的Proxy那样只能代理接口的了,

Enhancer是啥

cglib库的Enhancer在Spring AOP中作为一种生成代理的方式被广泛使用,Enhancer是cglib中使用频率很高的一个类,它是一个字节码增强器,可以用来为无接口的类创建代理。它的功能与java自带的Proxy类挺相似的。它会根据某个给定的类创建子类,并且所有非final的方法都带有回调钩子。

Enhancer 的作用

Enhancer 其被用于创建 Java 代理类,相较于 Java 标准库的 Proxy 类,它 特别地 ,能够支持那些没有实现接口的类的代理工作

建立要被增强的类

public class UserDao {

    public void  findAll(){
        System.out.println("查找所有的用户");
    }

    public void findUserById(){
        System.out.println("按照id查找");
    }
}

建立增强方法

import java.lang.reflect.Method;
//回调方法
public class UserService implements MethodInterceptor {
    /**
     *
     * @param obj 表示要进行增强的对象
     * @param method 表示拦截的方法
     * @param objects 数组表示参数列表,基本数据类型需要传入其包装类型,如int-->Integer、long-Long、double-->Double
     * @param methodProxy 表示对方法的代理,invokeSuper方法表示对被代理对象方法的调用
     * @return 执行结果
     * @throws Throwable 异常
     */

    @Override
    public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        // 注意这里是调用invokeSuper而不是invoke,否则死循环;
        // methodProxy.invokeSuper执行的是原始类的方法;
        // method.invoke执行的是子类的方法;
        System.out.println("执行之前");;
        Object result = methodProxy.invokeSuper(obj, objects);
        System.out.println("执行之后");;
        return result;
    }
}

方法用途

public class UsrDaoMain {
    public static void main(String[] args) {
        // 通过CGLIB动态代理获取代理对象的过程
        // 创建Enhancer对象,类似于JDK动态代理的Proxy类
        Enhancer enhancer = new Enhancer();
        // 设置目标类的字节码文件也就是要增强的类
        enhancer.setSuperclass(UserDao.class);
        // 设置回调函数
        enhancer.setCallback(new UserService());
        // create方法正式创建代理类
        UserDao userDao = (UserDao) enhancer.create();
        userDao.findAll();
        userDao.findUserById();
    }
}

输出

执行之前
查找所有的用户
执行之后
执行之前
按照id查找
执行之后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值