欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > SpringBoot的动态代理默认用的哪个???

SpringBoot的动态代理默认用的哪个???

2024/10/24 4:41:49 来源:https://blog.csdn.net/Gemini1995/article/details/140383437  浏览:    关键词:SpringBoot的动态代理默认用的哪个???

在 Spring Boot 中,动态代理的默认实现方式取决于被代理的对象的类型和具体配置:

  1. JDK 动态代理

    • 当代理的对象实现了一个或多个接口时,Spring 默认使用 JDK 动态代理。
    • JDK 动态代理只能代理实现了接口的类。
  2. CGLIB 动态代理

    • 当代理的对象没有实现任何接口时,Spring 会使用 CGLIB 动态代理。
    • CGLIB 动态代理是通过生成目标类的子类来实现代理的,因此它不要求目标类实现接口。

配置优先级

默认情况下,Spring 会根据上面的规则自动选择代理方式。但是,如果你希望强制使用特定的代理方式,可以通过配置来实现。例如,在 Spring 的 application.properties 文件中可以配置:

  • 强制使用 JDK 动态代理:

    spring.aop.proxy-target-class=false
    
  • 强制使用 CGLIB 动态代理:

    spring.aop.proxy-target-class=true
    

示例代码

假设有一个服务接口和它的实现类:

public interface MyService {void performTask();
}@Service
public class MyServiceImpl implements MyService {@Overridepublic void performTask() {// Task implementation}
}

根据默认行为,如果你对 MyServiceImpl 使用代理且没有任何特殊配置,Spring 将使用 JDK 动态代理,因为 MyServiceImpl 实现了 MyService 接口。

检查代理类型

你可以通过以下代码检查 Spring 使用的是哪种代理:

@Autowired
private ApplicationContext applicationContext;public void checkProxy() {MyService myService = applicationContext.getBean(MyService.class);System.out.println(AopUtils.isJdkDynamicProxy(myService)); // true if using JDK proxySystem.out.println(AopUtils.isCglibProxy(myService));      // true if using CGLIB proxy
}

总之,Spring Boot 默认情况下会根据类是否实现接口来选择使用 JDK 动态代理或 CGLIB 动态代理。通过配置,可以强制选择使用哪种代理机制。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com