推荐答案
Spring AOP 的代理机制主要有两种:
- JDK 动态代理:基于接口的代理,通过
java.lang.reflect.Proxy
类生成代理对象。它要求目标类必须实现至少一个接口。 - CGLIB 代理:基于类的代理,通过继承目标类生成子类来实现代理。它不需要目标类实现接口,但要求目标类不能是
final
类。
本题详细解读
JDK 动态代理
JDK 动态代理是 Spring AOP 默认的代理机制,适用于目标类实现了接口的场景。它的工作原理如下:
- 代理对象生成:通过
java.lang.reflect.Proxy
类的newProxyInstance
方法生成代理对象。 - InvocationHandler:代理对象的所有方法调用都会转发到
InvocationHandler
的invoke
方法中。 - 接口要求:目标类必须实现至少一个接口,因为 JDK 动态代理只能代理接口中的方法。
优点:
- 无需引入第三方库,JDK 自带支持。
- 性能较好,适合代理接口方法。
缺点:
- 只能代理接口方法,无法代理类中的方法。
CGLIB 代理
CGLIB 代理是 Spring AOP 的另一种代理机制,适用于目标类没有实现接口的场景。它的工作原理如下:
- 代理对象生成:通过 CGLIB 库生成目标类的子类作为代理对象。
- MethodInterceptor:代理对象的所有方法调用都会转发到
MethodInterceptor
的intercept
方法中。 - 类要求:目标类不能是
final
类,因为 CGLIB 通过继承生成代理类。
优点:
- 可以代理类中的方法,不依赖于接口。
- 适用于没有实现接口的类。
缺点:
- 需要引入 CGLIB 库。
- 性能略低于 JDK 动态代理,尤其是在生成代理对象时。
选择依据
- JDK 动态代理:当目标类实现了接口时,优先使用 JDK 动态代理。
- CGLIB 代理:当目标类没有实现接口时,使用 CGLIB 代理。
Spring AOP 会根据目标类的情况自动选择合适的代理机制,开发者也可以通过配置强制使用 CGLIB 代理。