例子:
@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的实现。
如下图:
从图中可以看出,代理类的method1和method2都已经被做了特殊处理,所以才能有spring的那种特殊效果。
注意:
spring的
@Configuration注解的处理和其他代理方式不一样,配置类实例化之后直接运行某个方法或者调用其super方法(只存在一个实例)。而其他代理的方法则是delegate到原始类的实例中的方法中去(存在两个实例,cglib实例和原始类的实例)。
@Bean
public Service1 service1(){
return new Service1Impl();
}
@Bean
public Service2 service2(){
Service1 service1 = service1();
return new Service2Impl(service1);
}
这是一个spring的配置类,其中方法service2在内部调用了方法service1。
调用service1方法 | 调用service2方法 | |
使用cglib | 返回的是JDK代理类xxx | service1()方法返回的就是之前创建的代理类xxx |
不使用cglib | 每次返回的都是new出的变量 | service1()方法返回的仍是新new出的变量,与之前的毫无关系 |