当前位置: 首页 > news >正文

Spring选择哪种方式代理?

口语化答案

好的,面试官,动态代理的方式主要是 jdk 动态代理 cglib 动态代理,spring 也是使用这两种方式,具体选择哪种最主要取决于被代理的类有没有实现接口,如果类已经实现了接口,就用 jdk 的动态代理即可,如果没有实现接口,就需要用子类的形式,采用 cglib 动态代理。在 Spring 配置中,可以通过@EnableAspectJAutoProxy注解的proxyTargetClass属性来强制使用 CGLIB 代理。

面试得分点

有无接口,EnableAspectJAutoProxy 强制使用

题目详细答案

Spring AOP 主要通过两种方式创建代理:JDK 动态代理和 CGLIB 代理。

JDK 动态代理

适用范围:JDK 动态代理仅适用于实现了一个或多个接口的类。

实现原理:JDK 动态代理使用java.lang.reflect.Proxy类和相关的InvocationHandler接口来创建代理对象。

特点:代理对象是目标对象实现的接口类型的实例

CGLIB 代理

适用范围:CGLIB 代理适用于没有实现接口的类,或者需要代理类中的所有方法(包括那些没有在接口中定义的方法)。

实现原理:CGLIB 代理使用字节码生成技术,在运行时生成目标类的子类,并在子类中拦截方法调用。

特点:代理对象是目标类的子类

Spring 代理选择策略

Spring AOP 默认的代理选择策略如下:

  1. 如果目标对象实现了至少一个接口,Spring AOP 会优先选择使用JDK 动态代理
  2. 如果目标对象没有实现任何接口,Spring AOP 会使用CGLIB 代理

配置代理方式

在 Spring 配置中,可以通过@EnableAspectJAutoProxy注解的proxyTargetClass属性来强制使用 CGLIB 代理。

使用 JDK 动态代理(默认行为)

如果目标对象实现了接口,Spring 默认会使用 JDK 动态代理。

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
@EnableAspectJAutoProxy
public class AppConfig {// 配置 Bean
}
强制使用 CGLIB 代理

无论目标对象是否实现了接口,都可以通过设置proxyTargetClass属性为true来强制使用 CGLIB 代理:

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {// 配置 Bean
}

http://www.lryc.cn/news/611805.html

相关文章:

  • 阿里云DMS Data Copilot——高效智能的数据助手,助力企业实现数据驱动的未来
  • 深入理解 Maven POM 文件:核心配置详解
  • Jenkinsfile各指令详解
  • Java学习第一百零九部分——Jenkins(一)
  • 基于通用优化软件GAMS的数学建模和优化分析
  • AlphaEarth模型架构梳理及借鉴哪些深度学习领域方面的思想
  • React:受控组件和非受控组件
  • WebStorm转VSCode:高效迁移指南
  • 前端开发_怎么禁止用户复制内容
  • vue3 el-dialog自定义实现拖拽、限制视口范围增加了拖拽位置持久化的功能
  • 【前端开发】三. JS运算符
  • 2.6 sync
  • vue3 find 数组查找方法
  • JSON巴巴 - 专业JSON格式化工具:让任何JSON都能完美格式化
  • Excel将整列值转换为字符串
  • Git 乱码文件处理全流程指南
  • 通过最严时序标准,再登产业图谱榜首,TDengine 时序数据库在可信数据库大会荣获双荣誉
  • Apache Flink 的详细介绍
  • 时序数据库的发展现状与未来趋势
  • Excel单元格设置下拉框、选项背景
  • 【OSCP】- Monitoring 靶场学习(Proving Grounds Play)
  • SpringBoot 整合Langchain4j 对接主流大模型实战详解
  • 科技云报到:Agent应用爆发,谁成为向上托举的力量?
  • 第一章-网络信息安全概述
  • 数据赋能(381)——数据挖掘——支持异类数据库
  • C语言的数组与字符串练习题2
  • GitHub 趋势日报 (2025年08月05日)
  • Gitlab+Jenkins+K8S+Registry 建立 CI/CD 流水线
  • 8.6 CSS3rem布局
  • npm scripts 使用指南