当前位置:实例文章 » JAVA Web实例» [文章]SpringBoot2为什么默认使用CGLib不再使用JDK动态代理

SpringBoot2为什么默认使用CGLib不再使用JDK动态代理

发布人:shili8 发布时间:2025-03-09 08:18 阅读次数:0

**Spring Boot2 中的 CGLib 动态代理**

在 Spring Boot1.x 版本中,Spring 框架使用 JDK 动态代理来实现 AOP(Aspect-Oriented Programming)的功能。然而,从 Spring Boot2 开始,Spring 框架默认使用 CGLib 动态代理取代了 JDK 动态代理。

**为什么选择 CGLib**

在 Spring Boot2 中,CGLib 动态代理成为默认的选择,因为它提供了更好的性能和灵活性。下面是几个主要原因:

1. **性能**: CGLib 动态代理比 JDK 动态代理快得多,因为它使用了 Java 的反射机制来创建代理类,而不是像 JDK 动态代理那样通过字节码操作。
2. **灵活性**: CGLib 动态代理可以动态地改变目标对象的行为,包括添加新的方法或修改现有的方法,这使得它比 JDK 动态代理更适合于复杂的 AOP 应用场景。

**什么是 CGLib**

CGLib 是一个 Java 库,它提供了一个用于创建动态代理类的框架。它可以根据目标对象的接口或类来创建代理类,并且可以在运行时改变代理类的行为。

下面是一个简单的例子,展示了如何使用 CGLib 来创建一个动态代理类:

javaimport net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Hello {
 public void sayHello() {
 System.out.println("Hello, World!");
 }
}

class HelloProxy implements MethodInterceptor {
 private Hello target;

 public HelloProxy(Hello target) {
 this.target = target;
 }

 @Override public Object intercept(Object obj, Method method, MethodProxy proxy, Throwable th) throws Throwable {
 System.out.println("Before sayHello()");
 target.sayHello();
 System.out.println("After sayHello()");
 return null;
 }
}

public class Main {
 public static void main(String[] args) {
 Hello hello = new Hello();
 Enhancer enhancer = new Enhancer();
 enhancer.setSuperclass(Hello.class);
 enhancer.setCallback(new HelloProxy(hello));
 Hello proxy = (Hello) enhancer.create();
 proxy.sayHello();
 }
}

在这个例子中,我们使用 CGLib 来创建一个动态代理类 `HelloProxy`,它实现了 `MethodInterceptor` 接口。我们通过设置目标对象 `hello` 和回调函数 `new HelloProxy(hello)` 来配置代理类。

**Spring Boot2 中的 CGLib 配置**

在 Spring Boot2 中,CGLib 动态代理是默认的 AOP 实现。如果你想使用 JDK 动态代理,你需要在你的应用程序中添加以下依赖:
xml<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-aop</artifactId>
 <exclusions>
 <exclusion>
 <groupId>net.sf.cglib</groupId>
 <artifactId>cglib</artifactId>
 </exclusion>
 </exclusions>
</dependency>

然后,你需要在你的配置类中添加以下代码:
java@Configuration@EnableAspectJAutoProxy(proxyTargetClass = false)
public class AppConfig {
 // ...
}

这将告诉 Spring 使用 JDK 动态代理来实现 AOP。

**总结**

Spring Boot2 中的 CGLib 动态代理提供了更好的性能和灵活性。通过使用 CGLib,你可以创建动态代理类并在运行时改变它们的行为。这使得它成为一个非常强大的工具,适合于复杂的 AOP 应用场景。

如果你想使用 JDK 动态代理,你需要添加依赖并配置 Spring 来使用它。但是,请注意,这可能会影响你的应用程序的性能和灵活性。

相关标签:java开发语言
其他信息

其他资源

Top