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

server/2024/9/23 9:37:30/

在 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
    

示例代码

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

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

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

检查代理类型

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

java">@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 动态代理。通过配置,可以强制选择使用哪种代理机制。


http://www.ppmy.cn/server/59911.html

相关文章

通用详情页的打造

背景介绍 大家都知道,详情页承载了站内的核心流量。它的量级到底有多大呢? 我们来看一下,日均播放次数数亿次,这么大的流量,其重要程度可想而知。 在这样一个页面,每一个功能都是大量业务的汇总点。 作为…

JAVA基础知识思维导图分享

这里为大家分享我自己之前做的一份JAVA基础知识思维导图: 由于太大了上传不了,需要的友友们,可以私信我哦(Q:3193045624发)!

OpenCV一个简单的摄像头调用与关闭

在使用OpenCV(Open Source Computer Vision Library)进行摄像头调用与关闭时,通常使用cv2.VideoCapture()函数来调用摄像头,并通过适当的方式关闭它。 调用摄像头 首先,需要导入OpenCV库(通常简写为cv2&a…

科技与水利的完美融合:从数据采集到智能决策,全面解析智慧水利解决方案如何助力水利行业实现智能化管理

本文关键词:智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

在 Kotlin 中,`@JvmOverloads` 注解用于为具有默认参数值的函数生成重载方法

在 Kotlin 中,JvmOverloads 注解用于为具有默认参数值的函数生成重载方法。这个注解在你需要从 Java 代码调用 Kotlin 函数时特别有用,因为 Java 不支持默认参数值。 下面是一个例子,说明 JvmOverloads 的工作原理: Kotlin 代码…

C++ 函数返回值是void* 使用场景

函数返回值为 void* 的使用场景主要涉及以下几个方面: 1、 通用指针传递 void* 是一种通用指针类型,可以指向任何类型的数据。在某些情况下,你可能需要编写一个函数,该函数可以返回指向不同类型数据的指针。使用 void* 可以实现…

Kubelet 认证

当我们执行kubectl exec -it pod [podName] sh命令时,apiserver会向kubelet发起API请求。也就是说,kubelet会提供HTTP服务,而为了安全,kubelet必须提供HTTPS服务,且还要提供一定的认证与授权机制,防止任何知…

Qt/QML学习-动画元素

QML学习 动画元素例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")Rectangle {id: rectwidth: 50height: 50color: "red"}SequentialAnimation {runni…