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 来使用它。但是,请注意,这可能会影响你的应用程序的性能和灵活性。

