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

SpEL(Spring Expression Language)使用详解

SpEL(Spring Expression Language)是 Spring 框架中一种强大的表达式语言,支持在运行时动态查询和操作对象图。它与 Spring 生态深度集成,广泛应用于依赖注入、数据绑定、AOP、安全规则等场景。以下是其核心语法、应用场景及使用示例的详细解析:

在这里插入图片描述


一、核心语法与功能

  1. 基础表达式

    • 字面量:支持字符串、数值、布尔值、null等,如 #{'Hello'}

    • 算术与逻辑运算:包括 +-*/% 以及 andornot 等。

    • 三元运算符:#{age > 18 ? '成年' : '未成年'}

  2. 对象操作

    • 属性访问:#{person.name} 或嵌套属性 #{person.address.city}

    • 方法调用:直接调用实例方法('abc'.toUpperCase())或静态方法(T(java.lang.Math).random())。

    • 构造函数:#{new com.example.User('张三')}

  3. 集合操作

    • 访问元素:#{list[0]}#{map['key']}

    • 投影与筛选:

      • 投影:#{list.![name]}(提取所有元素的 name 属性)。

      • 筛选:#{list.?[age > 18]}(过滤年龄大于18的元素)。

    • 聚合计算:#{list.![price].sum()} 计算总价。

  4. 上下文变量与根对象

    • 变量定义:context.setVariable("x", 10),表达式使用 #{#x}

    • 根对象操作:#{#root.name} 直接访问根对象属性。


二、应用场景与示例

  1. 依赖注入(DI)
    在 XML 或注解配置中动态赋值,如注入环境变量或计算值:

    <bean id="dataSource" class="DataSource"><property name="url" value="#{systemProperties['db.url'] ?: 'jdbc:default'}" /><property name="timeout" value="#{T(java.lang.Math).random() * 100}" />
    </bean>
    
  2. AOP 切面与日志记录
    结合 @Aspect 和自定义注解,动态生成日志内容:

    @Aspect
    public class LogAspect {@Before("@annotation(log) && args(user)")public void logUserAction(JoinPoint jp, User user, RequestLog log) {String action = parser.parseExpression(log.value()).getValue(context, String.class);// 输出如 "用户张三删除了ID=100的记录"}
    }
    
  3. 数据绑定与验证
    在 Spring MVC 中绑定请求参数并验证:

    @PostMapping("/submit")
    public String submit(@RequestParam("#{user.email}") String email) {// 自动绑定 user 对象的 email 属性
    }
    
  4. 安全规则与权限控制
    在 Spring Security 中定义动态权限:

    <security:http><security:intercept-url pattern="/admin/**" access="hasRole('ADMIN') and #{@permissionService.checkIp()}"/>
    </security:http>
    
  5. 动态配置解析
    解析配置文件中的复杂逻辑:

    app.maxUsers=#{systemEnvironment['MAX_USERS'] ?: 1000}
    app.discount=#{T(java.time.LocalDate).now().getMonthValue() == 12 ? 0.8 : 1.0}
    

三、使用注意事项

  1. 性能优化

    • 避免复杂表达式循环计算,可预计算或缓存结果。

    • 使用 SpelCompiler 编译高频表达式提升性能。

  2. 错误处理

    • 类型不匹配:显式指定类型转换,如 #{T(Integer).valueOf('100')}

    • 属性不存在:使用安全导航操作符 ?.(如 #{user?.address?.city})避免空指针。

  3. @Value 注解结合
    动态注入配置值:

    @dValue("#{config['api.key']}")
    private String apiKey;
    

四、示例代码解析

  1. 对象属性操作

    Inventor tesla = new Inventor("Nikola Tesla", new Date(), "Serbian");
    Expression exp = parser.parseExpression("name");
    String name = exp.getValue(tesla, String.class); // 输出 "Nikola Tesla"
    
  2. 集合筛选与投影

    List<User> users = Arrays.asList(new User("张三", 20), new User("李四", 16));
    List<String> adultNames = parser.parseExpression("?[age >= 18].![name]").getValue(users, List.class); // 输出 ["张三"]
    

五、Java解析SpEL

SpEL(Spring Expression Language)是Spring框架中用于动态解析和操作对象的表达式语言。以下是Java解析SpEL的核心流程、代码示例及关键技术的分步解析:


1. 核心类与解析流程
SpEL的解析基于两个核心组件:
ExpressionParser:负责解析字符串表达式,生成可执行的Expression对象。常用实现类为SpelExpressionParser

EvaluationContext:提供表达式执行时的上下文环境(如变量、根对象),默认实现为StandardEvaluationContext

解析流程:

  1. 表达式解析:将字符串表达式转换为抽象语法树(AST)。
  2. 上下文绑定:设置变量或根对象到EvaluationContext
  3. 表达式求值:通过getValue()方法执行表达式并获取结果。
// 示例:基础解析流程
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello ' + 'SpEL'");
String result = exp.getValue(String.class);  // 输出 "Hello SpEL"

2. 变量与上下文操作
通过EvaluationContext注入变量,支持表达式动态引用:

StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("x", 10);
context.setVariable("y", 20);Expression exp = parser.parseExpression("#x + #y");
int sum = exp.getValue(context, Integer.class);  // 输出30

应用场景:
• 动态配置注入(如结合@Value注解)。

• 在业务逻辑中实现条件判断(如权限校验)。


3. 对象属性与方法调用
SpEL支持直接操作对象属性和方法:

// 示例:访问对象属性
User user = new User("Alice", 30);
Expression exp = parser.parseExpression("name");
String name = exp.getValue(user, String.class);  // 输出 "Alice"// 示例:调用方法
exp = parser.parseExpression("'abc'.substring(0, 2)");
String substr = exp.getValue(String.class);  // 输出 "ab"

嵌套属性与复杂操作:

// 访问嵌套属性(如User.address.city)
exp = parser.parseExpression("address.city");
String city = exp.getValue(user, String.class);// 调用静态方法
exp = parser.parseExpression("T(java.lang.Math).random()");
double random = exp.getValue(Double.class)

4. 集合操作
SpEL提供强大的集合处理能力,支持投影(!)和筛选(?):

List<User> users = Arrays.asList(new User("Alice", 25), new User("Bob", 30)
);// 筛选年龄>28的用户
Expression exp = parser.parseExpression("#this.?[age > 28]");
List<User> filtered = (List<User>) exp.getValue(users);  // 输出 [Bob(30)]// 提取用户名的首字母并大写
exp = parser.parseExpression("#this.![name.toUpperCase().charAt(0)]");
List<Character> initials = (List<Character>) exp.getValue(users);  // 输出 [A, B]

5. 类型转换与操作符
• 类型转换:自动处理基本类型与包装类的转换。

• 操作符:支持算术(+, -)、逻辑(and, or)、三元运算符(?:)等。

示例:

// 三元运算符
exp = parser.parseExpression("age > 18 ? '成年' : '未成年'");
String status = exp.getValue(user, String.class);// 数学运算
exp = parser.parseExpression("(2 + 3) * 4");
int result = exp.getValue(Integer.class);  // 输出20

6. 安全与限制
为避免表达式注入风险,建议:
• 限制上下文权限:使用SimpleEvaluationContext替代StandardEvaluationContext

• 禁用危险操作:如禁止调用java.lang.Runtime等敏感类。

// 安全上下文示例
EvaluationContext safeContext = SimpleEvaluationContext.forReadOnlyDataBinding().build();
exp = parser.parseExpression("name");
String safeResult = exp.getValue(safeContext, user, String.class);

最佳实践

  1. 灵活性与性能平衡:复杂表达式建议预编译(SpelCompiler)提升性能。
  2. 避免硬编码:通过@Value动态注入配置,减少代码耦合。
  3. 安全优先:生产环境严格限制上下文权限。

通过上述技术组合,SpEL可实现动态配置、复杂业务逻辑和数据处理,成为Spring生态中提升灵活性的核心工具。


六、SpEL与正则表达式的核心区别

SpEL与正则表达式的核心区别

1. 设计目的与功能范围

  • SpEL(Spring Expression Language)

    是Spring框架的动态表达式语言,核心功能是运行时查询和操作对象图。支持方法调用、属性访问、集合操作、类型转换等,适用于依赖注入(如@Value)、AOP切面逻辑、动态配置等场景。例如,在Spring中注入配置值:@Value("#{systemProperties['db.url']}")

  • 正则表达式(Regular Expression)

    专为字符串模式匹配与文本处理设计,用于验证格式(如邮箱、电话)、搜索替换文本、提取特定内容等。例如,验证邮箱格式:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$


2. 语法与操作对象

  • SpEL

    • 语法类似Java,支持运算符(如+, and, matches)、类型安全操作(如T(java.lang.Math).random())和对象导航(如user.address.city)。

    • 可操作复杂对象、集合、静态方法,例如筛选集合:users.?[age > 18]

  • 正则表达式

    • 使用特殊符号定义字符模式(如^表示行首,\d匹配数字),仅处理字符串。例如,提取IP地址:(\d{1,3}\.){3}\d{1,3}

    • 不支持对象操作或类型转换,仅针对文本结构。


3. 上下文与变量支持

  • SpEL

    依赖EvaluationContext提供执行环境,可设置变量(如#x=10)、访问根对象、调用自定义函数,支持动态逻辑(如条件分支?:)。例如:

    EvaluationContext context = new StandardEvaluationContext(user);
    context.setVariable("threshold", 18);
    String status = parser.parseExpression("#age > #threshold ? '成年' : '未成年'").getValue(context, String.class);
    
  • 正则表达式

    无上下文概念,仅基于字符串本身进行模式匹配,无法动态引用外部变量或对象属性。


4. 类型处理与安全性

  • SpEL

    • 强类型支持:自动处理类型转换(如字符串转数字),可调用类型方法(如'abc'.toUpperCase())。

    • 潜在风险:复杂表达式可能引发安全漏洞(如代码注入),需限制上下文权限(使用SimpleEvaluationContext替代StandardEvaluationContext)。

  • 正则表达式

    • 仅处理字符串,无类型系统,匹配结果通常为字符串或布尔值。

    • 性能风险:复杂正则可能导致回溯爆炸(如嵌套量词(a+)+),需优化模式。


5. 典型应用场景对比

场景SpEL正则表达式
依赖注入动态注入配置值(@Value("#{config.key}")
数据验证支持但非主流(如matches操作符)核心用途(验证邮箱、密码复杂度)
文本处理简单字符串操作(如拼接'Hello' + name复杂模式匹配(提取IP、替换敏感词)
集合操作投影、筛选(list.![name]
方法调用支持(如T(System).currentTimeMillis()

6. 扩展性与集成

  • SpEL

    • 与Spring深度集成:支持@Cacheable@PreAuthorize等注解中的表达式。

    • 可扩展性:允许自定义函数、类型转换器(如实现EvaluationContext接口)。

  • 正则表达式

    • 跨语言通用:语法在Java、Python、JavaScript等语言中基本一致。

    • 工具链丰富:文本编辑器、IDE、日志分析工具均内置支持。


总结

维度SpEL正则表达式
核心目标动态操作对象与逻辑字符串模式匹配与文本处理
语法复杂度高(支持对象、方法、集合)中(专注字符模式)
类型支持强类型(对象、数字、布尔等)弱类型(仅字符串)
上下文依赖必需(EvaluationContext
典型工具Spring框架、AOP、缓存注解文本编辑器、日志分析工具、表单验证

选择建议:

  • 需操作对象、调用方法或集成Spring生态时,优先使用SpEL。

  • 需高效处理纯文本模式(如数据清洗、格式验证)时,选择正则表达式。


七、总结

SpEL 通过简洁的语法和强大的运行时能力,成为 Spring 生态中不可或缺的工具。其核心价值在于:

  • 动态性:支持运行时灵活计算,减少硬编码。

  • 集成性:无缝对接 Spring 的依赖注入、AOP、安全等模块。

  • 扩展性:通过自定义变量、函数和根对象满足复杂业务需求。

建议开发者结合具体场景合理选择表达式复杂度,并注意性能优化与异常处理。更多高级用法可参考 Spring 官方文档。

相关文章:

SpEL(Spring Expression Language)使用详解

SpEL&#xff08;Spring Expression Language&#xff09;是 Spring 框架中一种强大的表达式语言&#xff0c;支持在运行时动态查询和操作对象图。它与 Spring 生态深度集成&#xff0c;广泛应用于依赖注入、数据绑定、AOP、安全规则等场景。以下是其核心语法、应用场景及使用示…...

论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》

文章目录 一、如何做科研1.科研的步骤2.课题选择3.快速入门一个新领域&#xff1a;读论文&#xff0c;先读综述(1)自己看论文的时候&#xff0c;每篇论文花3-5分钟记录一下自己的idea和一些瞬间的想法(2)高质量文献&#xff1a;顶会顶刊(3)如何检索 4.注重团队协作与学术交流5.…...

免费公共DNS服务器推荐

当自动获取的DNS或本地运营商的DNS出现问题&#xff0c;可能导致软件无法连接服务器。此时&#xff0c;手动修改电脑的DNS设置或许能解决问题。许多用户觉得电脑上网速度慢、游戏卡顿&#xff0c;归咎于DNS问题。确实&#xff0c;我们可以自行设置一个DNS来改善网络体验。不少用…...

CK-S650-PA60S半导体专用读写器|读写头与绿联RS232串口转接头联机测试说明

CK-S650-PA60S半导体专用读写器|读写头是一款国产替代欧姆龙V640系列&#xff0c;支持德州仪器公司(TI)制造的RI-TRP-DR2B、RI-TRP-WR2B-40低频玻璃管标签|射频标签读写&#xff0c;广泛应用半导体硅片盒、晶圆盒、花篮等RFID插件识别与产品追溯领域。 CK-S650-PA60S半导体专用…...

Babel 基础使用指南:从安装到编译的完整流程

Babel 是当今前端开发中不可或缺的工具&#xff0c;它允许开发者使用最新的 JavaScript 特性&#xff0c;同时确保代码能在各种浏览器和环境中运行。本文将带你从零开始学习 Babel 的基础使用&#xff0c;涵盖安装、配置到实际编译的全过程。 1. 安装 Babel 和插件 首先&…...

uniapp-商城-52-后台 商家信息(商家信息数据,云对象使用)

1、概述 已经通过好几个篇幅来说明商家信息&#xff0c;包括logo、商家名称&#xff0c;地址&#xff0c;电话以及商家简介。通过表单组件和标签&#xff0c;以及我们的文件上传标签&#xff0c;都做了说明。&#xff08;logo上传&#xff0c;用的文件上传组件是上传到公共的数…...

【我的创作纪念日】512

机缘 还记得 2023 年 12 月 15 日&#xff0c;我撰写了第 1 篇技术博客&#xff1a;《oracle 跟踪文件--审计日志》。从此&#xff0c;这平凡的一天&#xff0c;赋予了我不平凡的意义。在那一刻&#xff0c;我已在创作这趟旅程中出发&#xff0c;并立志将工作中的经验总结&…...

共享内存与信号量结合

在Linux系统中&#xff0c;进程间通信&#xff08;IPC&#xff09;和原子性是并发编程中的核心问题。以下是对这些概念的详细分步解释&#xff1a; 一、进程间通信&#xff08;IPC&#xff09;方法 1. 管道&#xff08;Pipe&#xff09; 匿名管道&#xff1a;用于父子进程等有…...

西门子PLC s7-1200工艺对象“轴”的应用(1)

1. 工艺对象 “ 轴 ” 的概念 在西门子 S7-1200 PLC 中&#xff0c;术语 “ 轴 ” 特指用 “ 轴 ” 工艺对象表示的驱动器工艺映像。 “ 轴 ” 工艺对象是用 户程序与驱动器之间的接口&#xff0c;用于接收用户程序中的运动控制命令、执行这些命令并监视其运行情况。 运动控制…...

ubuntu22.04在 Docker容器中安装 ROS2-Humble

22.04 安装 docker 容器并实现rviz功能 1 docker pull命令拉取包含ROS-Humble的镜像&#xff1a; docker pull osrf/ros:humble-desktop-full-jammy docker images验证该镜像是否拉取成功。 使用镜像osrf/ros:humble-desktop-full-jammy创建并运行容器 sudo docker run -it…...

【LwIP源码学习6】UDP部分源码分析

前言 本文对lwip协议栈里UDP部分的源码进行分析。将源码中最关键部分提取出来&#xff0c;梳理UDP部分的设计框架。 应用层例子 首先举一个应用层使用UDP的简单例子&#xff0c;如下&#xff1a; //第一步&#xff1a;申请套接字 sock socket(AF_INET, SOCK_DGRAM, 0); //…...

Python Cookbook-7.10 在 MySQL 数据库中储存 BLOB

任务 想把一个二进制的大对象(BLOB)存入MySQL数据库 解决方案 MySQLdb 模块并不支持完整的占位符,不过可以使用模块的escape_string 函数来解决: import MySQLdb,cPickle #连接到数据库,用你的本机来测试数据库,并获得游标 connection = MySQLdb.connect(db = "tes…...

LWIP的ICMP协议

ICMP协议简介 ICMP协议是一个网络层协议 背景&#xff1a;如果丢包了&#xff0c;IP协议并不能通知传输层是否丢包以及丢包的原因。因此我们需要ICMP协议来完成这样的功能 为什么需要ICMP协议 1&#xff0c;IP 协议本身不提供差错报告和差错控制机制来保证数据报递交的有效…...

Spring Web MVC响应

返回静态页面 第一步 创建html时&#xff0c;要注意创建的路径&#xff0c;要在static下面 第二步 把需要写的内容写到body内 第三步 直接访问路径就可以 返回数据ResponseBody RestController Controller ResponseBody Controller&#xff1a;返回视图 ResponseBody&…...

STM32智能窗帘系统:从零到一的开发实战

简介 智能窗帘控制系统是智能家居领域的经典应用,随着物联网技术的不断发展,其功能从简单的远程控制演变为具备环境感知、多设备联动和跨平台兼容的智能系统。本篇文章将全面解析基于STM32的智能窗帘系统开发方案,从硬件设计到软件实现,再到企业级扩展功能,提供完整的代码…...

第三方评测机构如何凭借专业公正提供高可靠性软件检测服务?

第三方评测机构与软件开发及使用单位保持独立&#xff0c;凭借其专业技能和公正立场&#xff0c;为企业提供多样化的软件检测服务。这些检测结果的可靠性极高&#xff0c;不仅有助于企业减轻负担&#xff0c;节省人力和物力资源&#xff0c;而且赢得了业界的普遍认可。下面&…...

相或为K(位运算)蓝桥杯(JAVA)

这个题是相或为k&#xff0c;考察相或的性质&#xff0c;用俩个数举例子&#xff0c;011001和011101后面的数不管和哪个数相或都不可能变成前面的数&#xff0c;所以利用这个性质我们可以用相与运算来把和k对应位置的1都积累起来&#xff0c;看最后能不能拼起来k如果能拼起来k那…...

X.509证书详解

文章目录 1. X.509证书基础1.1 什么是X.509证书1.2 X.509证书结构1.3 证书编码格式2. Java中的X509Certificate2.1 类层次结构2.2 核心方法3. 获取X509Certificate对象3.1 从文件加载证书3.2 从KeyStore获取证书3.3 从HTTPS连接获取证书4. 创建自签名证书5. 证书验证5.1 基本验…...

深入浅出:Spring Boot 中 RestTemplate 的完整使用指南

在分布式系统开发中&#xff0c;服务间通信是常见需求。作为 Spring 框架的重要组件&#xff0c;RestTemplate 为开发者提供了简洁优雅的 HTTP 客户端解决方案。本文将从零开始讲解 RestTemplate 的核心用法&#xff0c;并附赠真实地图 API 对接案例。 一、环境准备 在 Spring…...

C++23 views::repeat (P2474R2) 写一篇博客

文章目录 std::views::enumerate 简介使用示例性能和灵活性与其他视图的结合使用总结 C23 标准引入了众多令人期待的新特性&#xff0c;其中 std::views::enumerate 便是一个备受瞩目的新增视图。这个新特性通过为迭代器提供索引和元素的组合&#xff0c;极大地简化了对集合中…...

微软向现实低头:悄悄延长Windows 10的Microsoft 365支持

快科技5月11日消息&#xff0c;Windows 10将在今年10月14日正式结束支持&#xff0c;此前微软曾明确表示&#xff0c;Microsoft 365&#xff08;M365&#xff09;应用&#xff0c;如Outlook、Teams、OneDrive、Word、Excel等&#xff0c;也将随之停止支持。 不过无法升级至Win…...

数字化转型-4A架构之技术架构

4A架构系列文章 数字化转型-4A架构&#xff08;业务架构、应用架构、数据架构、技术架构&#xff09; 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 一、 技术架构 Technology Architecture 1. 技…...

生产级 Flink CDC 应用开发与部署:MySQL 到 Kafka 同步示例

生产级 Flink CDC 应用开发与部署:MySQL 到 Kafka 同步示例 为了帮助你更好地理解如何将 Flink 作业部署为独立服务,下面我将提供一个完整的工程代码示例。这个例子基于之前的 MySQL 到 Kafka 的数据同步需求,但这次我们将 Flink 作业作为一个独立的服务进行打包和部署。 …...

【计算机视觉】OpenCV实战项目:Text-Extraction-Table-Image:基于OpenCV与OCR的表格图像文本提取系统深度解析

Text-Extraction-Table-Image&#xff1a;基于OpenCV与OCR的表格图像文本提取系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 图像预处理流水线2.2 表格结构检测算法2.3 OCR优化策略 3. 实战部署指南3.1 环境配置3.2 核心代码解析3.3 执行流程示例 4. 常见问题与解决方案4.…...

TSN网络与DIOS融合:破解煤矿井下电力系统越级跳闸难题

一、引言 1.1 研究背景与意义 在现代煤矿生产中&#xff0c;井下电力系统作为整个煤矿生产的动力核心&#xff0c;其重要性不言而喻。煤矿井下的各类机械设备&#xff0c;如采煤机、刮板输送机、通风机、排水泵等&#xff0c;都依赖稳定的电力供应才能正常运行。电力系统的稳定…...

ALLinSSL:一站式SSL证书管理解决方案

引言 在当今互联网安全日益重要的背景下,SSL证书已成为保护网站安全的必备工具。然而,管理多个SSL证书常常是一项繁琐且容易出错的任务。ALLinSSL应运而生,它提供了一个一站式的SSL证书管理解决方案,大大简化了证书的申请、安装和更新过程。本文将深入介绍ALLinSSL的特性、…...

jsAPI

环境准备 1 安装nvm nvm 即 (node version manager)&#xff0c;好处是方便切换 node.js 版本 安装注意事项 要卸载掉现有的 nodejs提示选择 nvm 和 nodejs 目录时&#xff0c;一定要避免目录中出现空格选用【以管理员身份运行】cmd 程序来执行 nvm 命令首次运行前设置好国…...

三、c语言练习四题

在这个系列中&#xff0c;我将以每次五题的形式加强对C语言的理解 1、 矩阵转置 要求 输入&#xff1a; 2 3 1 2 3 4 5 6输出&#xff1a; 1 4 2 5 3 6 //矩阵转置&#xff08;复习&#xff09; int main() {int i 0;int j 0;int arr[10][10];/*提前定义好一个大容量数…...

MySql(进阶)

一.数据库约束 约束类型 NOT NULL - 指示某列不能存储 NULL 值。 (not null不能为NILL) UNIQUE - 保证某列的每行必须有唯一的值。 &#xff08;unique唯一值&#xff09; DEFAULT - 规定没有给列赋值时的默认值。 &#xff08;default为空给定默认值&#xff09; PRIMARY…...

数据结构练习:顺序表题目

今天我们来进行顺序表后面习题的练习 目录 移除数组 思路1&#xff1a;查找后进行删除 思路2&#xff1a;新数组交换&#xff1a; 思路3&#xff1a;双指针法&#xff1a; 删除重复项 合并两个有序数组 移除数组 它的示例如下&#xff1a; 思路1&#xff1a;查找后进行删除…...

Ubuntu 22虚拟机【网络故障】快速解决指南

Ubuntu22虚拟机突然无法连接网络了&#xff0c;以下是故障排除步骤记录。 Ubuntu 22虚拟机网络故障快速解决指南 当在虚拟机中安装的 Ubuntu 22 系统出现 ping: connect: 网络不可达 和 ping: www.baidu.com: 域名解析出现暂时性错误的报错时&#xff0c;通常意味着虚拟机无法…...

SwaggerLogger.java

package further.config;import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils;/*** swagger启动ap…...

基于SpringBoot的在线教育管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

企业内训|智能调控系统算法与优化——某汽车厂商

5月9日&#xff0c;东北某市&#xff0c;TsingtaoAI团队为某汽车厂商的智能驾驶业务和研发团队交付“智能调控系统算法与优化”课程。 本课程系统化解析智能调控系统的核心算法原理与前沿优化技术&#xff0c;深度融合经典控制、现代控制及模型预测控制&#xff08;MPC&#x…...

Web 实时通信技术:WebSocket 与 Server-Sent Events (SSE) 深入解析

一、WebSocket&#xff1a; &#xff08;一&#xff09;WebSocket 是什么&#xff1f; WebSocket 是一种网络通信协议&#xff0c;它提供了一种在单个 TCP 连接上进行全双工通信的方式。与传统的 HTTP 请求 - 响应模型不同&#xff0c;WebSocket 允许服务器和客户端在连接建立…...

一个网球新手的学习心得

一个网球新手的学习心得 握拍正手反手发球 网球新手学习的几个重要点就是握拍、正手、反手&#xff0c;还有发球。 握拍 不管是发球还是拉球&#xff0c;首先要注意握拍的方式。 正手的话&#xff0c;一般是右手握住球拍柄&#xff0c;掌心对着球拍柄宽的一面&#xff0c;食…...

12、电子电路设计与PCB布局组件 (概念) - /设计与仿真组件/pcb-layout-tool

76个工业组件库示例汇总 电子电路设计与 PCB 布局组件 (概念演示) 概述 这是一个交互式的 Web 组件&#xff0c;用于演示电子电路原理图设计和 PCB 布局的基本概念。用户可以从元件库中选择元件&#xff0c;在原理图和 PCB 画布上放置、移动&#xff0c;进行原理图连线&…...

[特殊字符] 免税商品优选购物商城系统 | Java + SpringBoot + Vue | 前后端分离实战项目分享

一、项目简介 本项目为一款功能完备的 免税商品优选购物商城系统&#xff0c;采用 Java 后端 Vue 前端的主流前后端分离架构&#xff0c;支持用户、商家、管理员三类角色&#xff0c;满足商品浏览、下单、商家管理、后台运营等多项功能&#xff0c;适用于实际部署或作为毕业设…...

小土堆pytorch--torchvision中的数据集的使用dataloader的使用

torchvision中的数据集的使用&dataloader的使用 一级目录二级目录三级目录 1 torchvision 中的数据集的使用1.1 对与CIFAR - 10数据集的介绍1.2 数据集加载代码1.3 使用transform加载代码 2 DataLoader的使用2.1 DataLoader的作用1. 数据读取2. 数据预处理3. 批量处理4. 并…...

【RabbitMQ】 RabbitMQ高级特性(一)

文章目录 一、消息确认1.1、消息确认机制1.2、手动确认方法1.2.1、AcknowledgeMode.NONE1.2.2、AcknowledgeMode.AUTO1.3.3、AcknowledgeMode.MANUAL 二、持久性2.1、 交换机持久化2.2、队列持久化2.3、消息持久化 三、发送方确认3.1、confirm确认模式3.2、return退回模式3.3、…...

优化理赔数据同步机制:从4小时延迟降至15分钟

优化理赔数据同步机制&#xff1a;从4小时延迟降至15分钟 1. 分析当前同步瓶颈 首先诊断当前同步延迟原因&#xff1a; -- 检查主从复制状态&#xff08;在主库执行&#xff09; SHOW MASTER STATUS; SHOW SLAVE HOSTS;-- 在从库执行检查复制延迟 SHOW SLAVE STATUS\G -- 关…...

lampiao靶场渗透

lampiao https://www.vulnhub.com/entry/lampiao-1,249/ 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.245 3&#xff0c;对靶机进行端…...

云计算中的虚拟化:成本节省、可扩展性与灾难恢复的完美结合

云计算中虚拟化的 4 大优势 1. 成本效益 从本质上讲&#xff0c;虚拟化最大限度地减少了硬件蔓延。团队可以将多个虚拟机整合到单个物理主机上&#xff0c;而不是为每个工作负载部署单独的服务器。这大大减少了前期硬件投资和持续维护。 结果如何&#xff1f;更低的功耗、更低…...

jenkins built-in节点如何删除

1 概述 在 Jenkins 中&#xff0c;默认的 “Built-In” 节点&#xff08;即主节点/master&#xff09;无法直接删除&#xff0c;因为它是 Jenkins 的核心组件。它的存在&#xff0c;有时会造成困扰&#xff0c;因为部分作业调度到其上&#xff0c;由于 “Built-In” 节点的环境…...

QSS样式表的选择器

一个最简单的样式设置格式如下 QWidget {background-color: black; }将样式应用到对应的控件 QWidget* w new QWidget; w->setStyleSheet("QWidget {background-color: black;}");样式表中控件的设置有多种方式 通用选择器 /*匹配所有控件*/ *{}类型选择器 …...

Python多环境管理指南

Python/UV 多环境管理指南 在Python开发中&#xff0c;管理多个项目环境是一个常见需求。以下是使用Python内置工具和UV&#xff08;一种新兴的Python包管理器&#xff09;进行多环境管理的方法。 1. 使用Python内置venv管理多环境 创建虚拟环境 python -m venv /path/to/y…...

Java从入门到精通 - 数组

数组 此笔记参考黑马教程&#xff0c;仅学习使用&#xff0c;如有侵权&#xff0c;联系必删 文章目录 数组1. 认识数组2. 数组的定义和访问2.1 静态初始化数组2.1.1 数组的访问2.1.1 定义代码实现总结 2.1.2 数组的遍历2.1.2.1 定义代码演示总结 案例代码实现 2.2 动态初始化…...

《Vuejs 设计与实现》第 4 章(响应式系统)( 下 )

目录 4.6 避免无限递归循环 4.7 调度执行 4.8 计算属性 computed 与 lazy 4.9 watch 的实现原理 4.10 立即执行的 watch 与回调执行时机 4.11 过期副作用与竞态问题 总结 4.6 避免无限递归循环 在实现完善响应式系统时&#xff0c;需要注意避免无限递归循环。以以下代码…...

在 Windows 上为 Intel UHD Graphics 编译 OpenCL 程序

如果您使用的是 Intel UHD Graphics 集成显卡,以下是完整的 OpenCL 开发环境配置指南: 1. 准备工作 确认硬件支持 首先确认您的 Intel UHD Graphics 支持 OpenCL: 大多数第6代及以后的 Intel Core 处理器(Skylake 及更新架构)都支持 OpenCL 2.1+ 运行 clinfo 工具可以查…...

C++自学笔记 makefile

本博客参考南科大于仕琪教授的讲解视频和这位同学的学习笔记&#xff1a; 参考博客 感谢两位的分享。 makefile 的作用 用于组织大型项目的编译&#xff0c;是一个一键编译项目的脚本文件。 本博客通过四个版本的makefile逐步说明makefile的使用 使用说明 四个演示文件 …...