Spring AOP 的代理机制有哪些?

推荐答案

Spring AOP 的代理机制主要有两种:

  1. JDK 动态代理:基于接口的代理,通过 java.lang.reflect.Proxy 类生成代理对象。它要求目标类必须实现至少一个接口。
  2. CGLIB 代理:基于类的代理,通过继承目标类生成子类来实现代理。它不需要目标类实现接口,但要求目标类不能是 final 类。

本题详细解读

JDK 动态代理

JDK 动态代理是 Spring AOP 默认的代理机制,适用于目标类实现了接口的场景。它的工作原理如下:

  1. 代理对象生成:通过 java.lang.reflect.Proxy 类的 newProxyInstance 方法生成代理对象。
  2. InvocationHandler:代理对象的所有方法调用都会转发到 InvocationHandlerinvoke 方法中。
  3. 接口要求:目标类必须实现至少一个接口,因为 JDK 动态代理只能代理接口中的方法。

优点

  • 无需引入第三方库,JDK 自带支持。
  • 性能较好,适合代理接口方法。

缺点

  • 只能代理接口方法,无法代理类中的方法。

CGLIB 代理

CGLIB 代理是 Spring AOP 的另一种代理机制,适用于目标类没有实现接口的场景。它的工作原理如下:

  1. 代理对象生成:通过 CGLIB 库生成目标类的子类作为代理对象。
  2. MethodInterceptor:代理对象的所有方法调用都会转发到 MethodInterceptorintercept 方法中。
  3. 类要求:目标类不能是 final 类,因为 CGLIB 通过继承生成代理类。

优点

  • 可以代理类中的方法,不依赖于接口。
  • 适用于没有实现接口的类。

缺点

  • 需要引入 CGLIB 库。
  • 性能略低于 JDK 动态代理,尤其是在生成代理对象时。

选择依据

  • JDK 动态代理:当目标类实现了接口时,优先使用 JDK 动态代理。
  • CGLIB 代理:当目标类没有实现接口时,使用 CGLIB 代理。

Spring AOP 会根据目标类的情况自动选择合适的代理机制,开发者也可以通过配置强制使用 CGLIB 代理。

纠错
反馈