cglib代理

cglib代理

​ 在此之前,我们学习了JDK动态代理,而JDK动态代理有一定的局限性,因为使用JDK动态代理时,被代理类必须实现接口,然后动态代理生成的代理类同时实现该接口实现代理模式,但在特定情况下没办法让被代理类实现接口,那么此时我们就需要使用cglib代理。

代理模式的三要素

  • 两个成员:被代理对象、执行者(类似于Spring中切面的概念)
  • 使用场景:当某件事情不方便自己做,但是必须要做时使用代理模式。
  • 代理对象持有被代理对象的引用。

​ 在第一点中,执行者指的是代理对象的执行模板,例如在JDK动态代理中,实现InvocationHandler接口的类就是代理类中方法的执行模板。而在cglib代理中执行模板需要实现MethodInterceptor

使用cglib需要做的准备

JDK动态代理由于是JDK自带的,所以我们不需要在项目中引入第三方jar,但是cglib需要引入两个jar包:
在这里插入图片描述

cglib代理具体实例

创建被代理类

package _6代理模式.CGlib代理;

public class UserService  {

    public void addUser(){
        System.out.println("添加用户");
    }

    public void deleteUser() {
        System.out.println("删除用户");
    }

}

创建执行者

package _6代理模式.CGlib代理;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 执行者
 */
public class Executent implements MethodInterceptor {
    /**
     *
     * @param o 代表代理对象本身,可以它调用代理对象的其他方法
     * @param method   代理对象对应方法的字节码对象
     * @param objects 传入用户调用“代理对象”对应方法的参数数组
     * @param methodProxy  被代理对象方法的引用(通过它调用父类方法,从而达到代理的效果)
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("开启事务");
        Object result= null;
        try {
            result = methodProxy.invokeSuper(o,objects);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("回滚事务");
        }
        System.out.println("提交事务");
        return result;
    }
}

通过cglib生成代理对象

public class TestCglib {
    public static void main(String[] args) {
       	Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(UserService.class);
        //设置执行者
        enhancer.setCallback(new Executent());
        //创建代理对象
        UserService userService = (UserService) enhancer.create();
        userService.addUser();
    }
}

执行结果:

[外链图片转存失败(img-dLKjZne6-1562928349224)(…/images/27.png)]# cglib代理

​ 在此之前,我们学习了JDK动态代理,而JDK动态代理有一定的局限性,因为使用JDK动态代理时,被代理类必须实现接口,然后动态代理生成的代理类同时实现该接口实现代理模式,但在特定情况下没办法让被代理类实现接口,那么此时我们就需要使用cglib代理。

代理模式的三要素

  • 两个成员:被代理对象、执行者(类似于Spring中切面的概念)
  • 使用场景:当某件事情不方便自己做,但是必须要做时使用代理模式。
  • 代理对象持有被代理对象的引用。

​ 在第一点中,执行者指的是代理对象的执行模板,例如在JDK动态代理中,实现InvocationHandler接口的类就是代理类中方法的执行模板。而在cglib代理中执行模板需要实现MethodInterceptor

使用cglib需要做的准备

JDK动态代理由于是JDK自带的,所以我们不需要在项目中引入第三方jar,但是cglib需要引入两个jar包:

[外链图片转存失败(img-fEj9OQOA-1562928350449)(…/images/26.png)]

cglib代理具体实例

创建被代理类

package _6代理模式.CGlib代理;

public class UserService  {

    public void addUser(){
        System.out.println("添加用户");
    }

    public void deleteUser() {
        System.out.println("删除用户");
    }

}

创建执行者

package _6代理模式.CGlib代理;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 执行者
 */
public class Executent implements MethodInterceptor {
    /**
     *
     * @param o 代表代理对象本身,可以它调用代理对象的其他方法
     * @param method   代理对象对应方法的字节码对象
     * @param objects 传入用户调用“代理对象”对应方法的参数数组
     * @param methodProxy  被代理对象方法的引用(通过它调用父类方法,从而达到代理的效果)
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("开启事务");
        Object result= null;
        try {
            result = methodProxy.invokeSuper(o,objects);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("回滚事务");
        }
        System.out.println("提交事务");
        return result;
    }
}

通过cglib生成代理对象

public class TestCglib {
    public static void main(String[] args) {
       	Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(UserService.class);
        //设置执行者
        enhancer.setCallback(new Executent());
        //创建代理对象
        UserService userService = (UserService) enhancer.create();
        userService.addUser();
    }
}

执行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听到微笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值