spring之cglib代理的妙用

例子:
    @Bean
    public Service1 service1(){
        return new Service1Impl();
    }

    @Bean
    public Service2 service2(){
        Service1 service1 = service1();
        return new Service2Impl(service1);
    }

这是一个spring的配置类,其中方法service2在内部调用了方法service1。

对比使用cglib和不使用cglib的区别:
 调用service1方法调用service2方法
使用cglib返回的是JDK代理类xxxservice1()方法返回的就是之前创建的代理类xxx
不使用cglib每次返回的都是new出的变量service1()方法返回的仍是新new出的变量,与之前的毫无关系

原理:
cglig代理大家基本上已经耳熟能详了,就是通过子类化一个类来实现代理的。例如
一个类A有方法m1和m2,那么cglib会运行时创建一个继承类A的类B,就是类似手动敲一份.class文件,然后通过defineClass方法创建这个Class实体。在这个类B中,就会覆盖父类A的方法m1和m2的实现。
如下图:

从图中可以看出,代理类的method1和method2都已经被做了特殊处理,所以才能有spring的那种特殊效果。
注意:
spring的 @Configuration注解的处理和其他代理方式不一样,配置类实例化之后直接运行某个方法或者调用其super方法(只存在一个实例)。而其他代理的方法则是delegate到原始类的实例中的方法中去(存在两个实例,cglib实例和原始类的实例)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值