jdk cglib 动态代理

java的动态代理模式有两种实现 jdk和cglib的

jdk的就是要借助InvocationHandler和Proxy,由JDK生成一个新类,类名是 $ProxyN的格式, final的, 父类是 Proxy, implements了代理类的所有接口,是运行时动态生成的。 那么在Spring中,如果一个bean是有实现接口的,如果被 AOP 或者 @Async @Transaction 等开启了代理,则注入时必须用接口类型声明,不然无法注入进去,因为Spring容器内不是 原本的class了,但是仍然实现了原有声明的接口。

cglib是 通过继承去实现的,通过 cglib 的Enhancer指定代理的对象,做一个代理类的子类。cglib是基于 ASM实现的,AS允许在运行时对字节码进行修改和动态生成。 因此如果一个类是final的,是无法通过 cglib 去动态代理的。

Spring中,默认情况下 能走jdk动态代理就走jdk的动态代理,不能通过jdk就走cglib。

Spring中,如果一个类中声明了 @Transcation, @Async

Written on January 2, 2020