CGLIB代理学习

Cglib代理如何生成的及工作原理_cglib动态代理实现原理_Alan CGH的博客-CSDN博客

CGLIB动态代理底层实现原理-CSDN博客

1,通过spring的cglib库手动建代理对象。调用方法时是由生成的代理对象执行。

public static class MyInterceptor implements MethodInterceptor {
    public Object getProxy() {
        //修改存储代理类的地址
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "C:\\Users\\Desktop");
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Student.class);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println(o.getClass().getSimpleName());
        System.out.println(method.getName());
        System.out.println(methodProxy.getSignature());
        System.out.println(methodProxy.getSuperName());

        return methodProxy.invokeSuper(o, objects);
    }
}

public static void main(String[] args) {
    MyInterceptor myInterceptor = new MyInterceptor();
    Student proxy = (Student) myInterceptor.getProxy();
    proxy.test01();
}

2,debug spring生成的代理类。发现spring管理的代理对象调用方法时最终是由原始的本类对象执行而不是代理对象,所以在方法中再通过this调用方法时,是通过本类对象进行调用,不会执行切面(事务等)逻辑。(由此,得出事务失效的一个场景,就是通过this调用方法时,是由本类对象调用该方法,没有执行事物的切面逻辑,所以事务不会生效,前提是当前上下文没有事务环境)

CGLIB代理:org.springframework.aop.framework.CglibAopProxy.CglibMethodInvocation#invokeJoinpoint

PROXY代理:

proxy代理的对象执行后再由cglib代理的对象调用,又回到了cglib。

org/springframework/aop/framework/JdkDynamicAopProxy.java:208

spring全局代理配置改为proxy时,proxy代理的对象调用后会直接由原始对象调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值