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