当前位置: 首页 > 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.xdnf.cn/news/1250461.html

相关文章:

  • 电子电气架构 ---如何焕新升级为 48V 电气架构
  • 无人机航拍数据集|第4期 无人机太阳光伏板红外目标检测YOLO数据集10945张yolov11/yolov8/yolov5可训练
  • OpenHarmony源码解析之init进程
  • Android Activity webView页面视频悬浮小窗播放效果及技术难点
  • apache-tomcat-11.0.9安装及环境变量配置
  • 聊一聊RPC接口测试工具及方法
  • MonoFusion 与 Genie 3
  • Apollo中三种相机外参的可视化分析
  • Javascript/ES6+/Typescript重点内容篇——手撕(待总结)
  • W3D引擎游戏开发----从入门到精通【22】
  • 【科研绘图系列】R语言绘制瀑布图
  • sqli-labs靶场less40-less45
  • 012 网络—基础篇
  • 医疗AI中GPU部署的“非对等全节点架构“方案分析(上)
  • 如何创建一个vue项目
  • 5G随身WiFi怎么选?实测延迟/网速/续航,中兴V50适合商务,格行MT700适合短租、户外党~避坑指南+适用场景全解析
  • Git 分支管理:从新开发分支迁移为主分支的完整指南
  • 【数据结构初阶】--排序(四):归并排序
  • Linux基础命令的生产常用命令及其示例简单解释
  • 对接钉钉审批过程记录(C#版本)
  • C++与C语言实现Stack的对比分析
  • 基于 kubeadm 搭建 k8s 集群
  • Go语言数据类型深度解析:位、字节与进制
  • 深度学习(pytorch版)前言:环境安装和书籍框架介绍
  • 【运维进阶】DHCP服务配置和DNS域名解析
  • 基于串口实现可扩展的硬件函数 RPC 框架(附完整 Verilog 源码)
  • iOS混淆工具有哪些?在集成第三方 SDK 时的混淆策略与工具建议
  • docker容器临时文件去除,服务器容量空间
  • 力扣137:只出现一次的数字Ⅱ
  • 企业级Linux服务器安全:防火墙规则配置与Web/SSH服务优化指南