Spring框架的一大特点就是AOP,SpringAOP的本质就是动态代理,那么Spring到底使用的是JDK代理,还是cglib代理呢?

答:混合使用。如果被代理对象实现了接口,就优先使用JDK代理,如果没有实现接口,就用用cglib代理。

AOP(Aspect-OrientedProgramming,面向切面编程),AOP包括切面(aspect)、通知(advice)、连接点(joinpoint),实现方式就是通过对目标对象的代理在连接点前后加入通知,完成统一的切面操作。

aop底层采用代理机制进行实现。

· 接口 + 实现类:spring采用 jdk 的动态代理Proxy。
· 实现类:spring 采用 cglib字节码增强。

实现AOP的技术,主要分为两大类:


一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。

默认的策略是如果目标类是接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理。

如果目标对象实现了接口,可以强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入)。

两种代理方式: cglib动态代理和jdk动态代理的区别

两种代理方式: cglib动态代理和jdk动态代理的区别
《两种代理方式: cglib动态代理和jdk动态代理的区别》

两者动态代理哪个更快

[和笔记对接]Spring AOP 中 JDK 和 CGLib 动态代理哪个更快?