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代理类xxx service1()方法返回的就是之前创建的代理类xxx
不使用cglib 每次返回的都是new出的变量 service1()方法返回的仍是新new出的变量,与之前的毫无关系

原理:
cglig代理大家基本上已经耳熟能详了,就是通过子类化一个类来实现代理的。例如
一个类A有方法m1和m2,那么cglib会运行时创建一个继承类A的类B,就是类似手动敲一份.class文件,然后通过defineClass方法创建这个Class实体。在这个类B中,就会覆盖父类A的方法m1和m2的实现。
如下图:
spring之cglib代理的妙用_第1张图片
从图中可以看出,代理类的method1和method2都已经被做了特殊处理,所以才能有spring的那种特殊效果。
注意:
spring的 @Configuration注解的处理和其他代理方式不一样,配置类实例化之后直接运行某个方法或者调用其super方法(只存在一个实例)。而其他代理的方法则是delegate到原始类的实例中的方法中去(存在两个实例,cglib实例和原始类的实例)。

你可能感兴趣的:(spring之cglib代理的妙用)