当前位置: 首页 > 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.dtcms.com/a/318585.html

相关文章:

  • 12、Docker Compose 安装 Redis
  • CGAL Kernel 和 Traits 类深度解析:从官方教程到实践应用
  • 疯狂星期四文案网第30天运营日记
  • 从Token到序列:阿里GSPO算法如何让大模型训练更稳、更强?
  • CubeFS存储(一)
  • 16-DS18B20-±0.5℃精度-12bitADC--55°C ~ +125°C
  • ubuntu server 工业环境部署手册[2025-08-06]
  • ⭐CVPR 文本到 3D 场景生成新突破:Prometheus 框架解析
  • http请求结构体解析
  • 【C++】二叉树进阶
  • 人工智能大数据模型驱动企业创新
  • 商用密码应用安全性评估法律法规的重要性及演变过程
  • 力扣-15.三数之和
  • 五、Istio管理网格外部服务
  • 快速准确的千兆像素病理图像分类,采用分层蒸馏多实例学习(每日一文)
  • ssm复习
  • 【RabbitMQ】高级特性—死信队列详解
  • 560. 和为 K 的子数组 - 前缀和思想
  • MATLAB下载教程MATLAB R2025a 保姆级安装步骤(附安装包)
  • 数据结构——双向链表及makefile
  • c++ 中 原子锁、互斥锁、自旋锁的区别和详细用法
  • 大模型 + 垂直场景:搜索 / 推荐 / 营销 / 客服领域开发
  • 【Redis】Linux部署redis 7集群部署三主三从、ACL新建用户及密码(图文教程)
  • ​ubuntu22.04系统入门 (四)linux入门命令 权限管理、ACL权限、管道与重定向
  • 集合数据类型Map和Set
  • pcl手动直通滤波
  • LeetCode每日一题,8-6
  • 基于Simulink/MWORKS的文字与开关量混合传输系统设计
  • 流式输出 vs 非流式输出
  • SpringBoot设置跨域的几种方式