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

Spring Boot 一个接口实现任意表的 Excel 导入导出

Java的web开发需要excel的导入导出工具,所以需要一定的工具类实现,如果是使用easypoi、Hutool导入导出excel,会非常的损耗内存,因此可以尝试使用easyexcel解决大数据量的数据的导入导出,且可以通过Java8的函数式编程解决该问题。

使用easyexcel,虽然不太会出现OOM的问题,但是如果是大数据量的情况下也会有一定量的内存溢出的风险,所以我打算从以下几个方面优化这个问题:

  • 使用Java8的函数式编程实现低代码量的数据导入

  • 使用反射等特性实现单个接口导入任意excel

  • 使用线程池实现大数据量的excel导入

  • 通过泛型实现数据导出

maven导入

<!--EasyExcel相关依赖-->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version>
</dependency>

使用泛型实现对象的单个Sheet导入

先实现一个类,用来指代导入的特定的对象

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("stu_info")
@ApiModel("学生信息")
//@ExcelIgnoreUnannotated 没有注解的字段都不转换
publicclass StuInfo {privatestaticfinallong serialVersionUID = 1L;/*** 姓名*/// 设置字体,此处代表使用斜体
//    @ContentFontStyle(italic = BooleanEnum.TRUE)// 设置列宽度的注解,注解中只有一个参数value,value的单位是字符长度,最大可以设置255个字符@ColumnWidth(10)// @ExcelProperty 注解中有三个参数value,index,converter分别代表表名,列序号,数据转换方式@ApiModelProperty("姓名")@ExcelProperty(value = "姓名",order = 0)@ExportHeader(value = "姓名",index = 1)private String name;/*** 年龄*/
//    @ExcelIgnore不将该字段转换成Excel@ExcelProperty(value = "年龄",order = 1)@ApiModelProperty("年龄")@ExportHeader(value = "年龄",index = 2)private Integer age;/*** 身高*///自定义格式-位数
//    @NumberFormat("#.##%")@ExcelProperty(value = "身高",order = 2)@ApiModelProperty("身高")@ExportHeader(value = "身高",index = 4)private Double tall;/*** 自我介绍*/@ExcelProperty(value = "自我介绍",order = 3)@ApiModelProperty("自我介绍")@ExportHeader(value = "自我介绍",index = 3,ignore = true)private String selfIntroduce;/*** 图片信息*/@ExcelProperty(value = "图片信息",order = 4)@ApiModelProperty("图片信息")@ExportHeader(value = "图片信息",ignore = true)private Blob picture;/*** 性别*/@ExcelProperty(value = "性别",order = 5)@ApiModelProperty("性别")private Integer gender;/*** 入学时间*///自定义格式-时间格式@DateTimeFormat("yyyy-MM-dd HH:mm:ss:")@ExcelProperty(value = "入学时间",order = 6)@ApiModelProperty("入学时间")private String intake;/*** 出生日期*/@ExcelProperty(value = "出生日期",order = 7)@ApiModelProperty("出生日期")private String birthday;}

重写ReadListener接口

@Slf4j
publicclass UploadDataListener<T> implements ReadListener<T> {/*** 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收*/privatestaticfinalint BATCH_COUNT = 100;/*** 缓存的数据*/private List<T> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);/*** Predicate用于过滤数据*/private Predicate<T> predicate;/*** 调用持久层批量保存*/private Consumer<Collection<T>> consumer;public UploadDataListener(Predicate<T> predicate, Consumer<Collection<T>> consumer) {this.predicate = predicate;this.consumer = consumer;}public UploadDataListener(Consumer<Collection<T>> consumer) {this.consumer = consumer;}/*** 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来** @param demoDAO*//*** 这个每一条数据解析都会来调用** @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(T data, AnalysisContext context) {if (predicate != null && !predicate.test(data)) {return;}cachedDataList.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (cachedDataList.size() >= BATCH_COUNT) {try {// 执行具体消费逻辑consumer.accept(cachedDataList);} catch (Exception e) {log.error("Failed to upload data!data={}", cachedDataList);thrownew BizException("导入失败");}// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 这里也要保存数据,确保最后遗留的数据也存储到数据库if (CollUtil.isNotEmpty(cachedDataList)) {try {// 执行具体消费逻辑consumer.accept(cachedDataList);log.info("所有数据解析完成!");} catch (Exception e) {log.error("Failed to upload data!data={}", cachedDataList);// 抛出自定义的提示信息if (e instanceof BizException) {throw e;}thrownew BizException("导入失败");}}}
}

Controller层的实现

@ApiOperation("只需要一个readListener,解决全部的问题")
@PostMapping("/update")
@ResponseBody
public R<String> aListener4AllExcel(MultipartFile file) throws IOException {try {EasyExcel.read(file.getInputStream(),StuInfo.class,new UploadDataListener<StuInfo>(list -> {// 校验数据ValidationUtils.validate(list);// dao 保存···//最好是手写一个,不要使用mybatis-plus的一条条新增的逻辑service.saveBatch(list);log.info("从Excel导入数据一共 {} 行 ", list.size());})).sheet().doRead();} catch (IOException e) {log.error("导入失败", e);thrownew BizException("导入失败");}return R.success("SUCCESS");
}

但是这种方式只能实现已存对象的功能实现,如果要新增一种数据的导入,那我们需要怎么做呢?关注公众号:码猿技术专栏,回复关键词:1111 获取阿里内部java性能调优手册!

可以通过读取成Map,根据顺序导入到数据库中。

通过实现单个Sheet中任意一种数据的导入

Controller层的实现

@ApiOperation("只需要一个readListener,解决全部的问题")
@PostMapping("/listenMapDara")
@ResponseBody
public R<String> listenMapDara(@ApiParam(value = "表编码", required = true)@NotBlank(message = "表编码不能为空")@RequestParam("tableCode") String tableCode,@ApiParam(value = "上传的文件", required = true)@NotNull(message = "上传文件不能为空") MultipartFile file) throws IOException {try {//根据tableCode获取这张表的字段,可以作为insert与剧中的信息EasyExcel.read(file.getInputStream(),new NonClazzOrientedListener(list -> {// 校验数据
//                                        ValidationUtils.validate(list);// dao 保存···log.info("从Excel导入数据一共 {} 行 ", list.size());})).sheet().doRead();} catch (IOException e) {log.error("导入失败", e);thrownew BizException("导入失败");}return R.success("SUCCESS");
}

重写ReadListener接口

@Slf4j
publicclass NonClazzOrientedListener implements ReadListener<Map<Integer, String>> {/*** 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收*/privatestaticfinalint BATCH_COUNT = 100;private List<List<Object>> rowsList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);private List<Object> rowList = new ArrayList<>();/*** Predicate用于过滤数据*/private Predicate<Map<Integer, String>> predicate;/*** 调用持久层批量保存*/private Consumer<List> consumer;public NonClazzOrientedListener(Predicate<Map<Integer, String>> predicate, Consumer<List> consumer) {this.predicate = predicate;this.consumer = consumer;}public NonClazzOrientedListener(Consumer<List> consumer) {this.consumer = consumer;}/*** 添加deviceName标识*/privateboolean flag = false;@Overridepublic void invoke(Map<Integer, String> row, AnalysisContext analysisContext) {consumer.accept(rowsList);rowList.clear();row.forEach((k, v) -> {log.debug("key is {},value is {}", k, v);rowList.add(v == null ? "" : v);});rowsList.add(rowList);if (rowsList.size() > BATCH_COUNT) {log.debug("执行存储程序");log.info("rowsList is {}", rowsList);rowsList.clear();}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {consumer.accept(rowsList);if (CollUtil.isNotEmpty(rowsList)) {try {log.debug("执行最后的程序");log.info("rowsList is {}", rowsList);} catch (Exception e) {log.error("Failed to upload data!data={}", rowsList);// 抛出自定义的提示信息if (e instanceof BizException) {throw e;}thrownew BizException("导入失败");} finally {rowsList.clear();}}}

这种方式可以通过把表中的字段顺序存储起来,通过配置数据和字段的位置实现数据的新增,那么如果出现了导出数据模板/手写excel的时候顺序和导入的时候顺序不一样怎么办?

可以通过读取header进行实现,通过表头读取到的字段,和数据库中表的字段进行比对,只取其中存在的数据进行排序添加

/*** 这里会一行行的返回头** @param headMap* @param context*/
@Override
public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {//该方法必然会在读取数据之前进行Map<Integer, String> columMap = ConverterUtils.convertToStringMap(headMap, context);//通过数据交互拿到这个表的表头
//        Map<String,String> columnList=dao.xxxx();Map<String, String> columnList = new HashMap();columMap.forEach((key, value) -> {if (columnList.containsKey(value)) {filterList.add(key);}});//过滤到了只存在表里面的数据,顺序就不用担心了,可以直接把filterList的数据用于排序,可以根据mybatis做一个动态sql进行应用log.info("解析到一条头数据:{}", JSON.toJSONString(columMap));// 如果想转成成 Map<Integer,String>// 方案1: 不要implements ReadListener 而是 extends AnalysisEventListener// 方案2: 调用 ConverterUtils.convertToStringMap(headMap, context) 自动会转换
}

那么这些问题都解决了,如果出现大数据量的情况,如果要极大的使用到cpu,该怎么做呢?

可以尝试使用线程池进行实现

使用线程池进行多线程导入大量数据

Java中线程池的开发与使用与原理我可以单独写一篇文章进行讲解,但是在这边为了进行好的开发我先给出一套固定一点的方法。

由于ReadListener不能被注册到IOC容器里面,所以需要在外面开启

详情可见

https://juejin.cn/post/7251566038524133436

通过泛型实现对象类型的导出

public <T> void commonExport(String fileName, List<T> data, Class<T> clazz, HttpServletResponse response) throws IOException {if (CollectionUtil.isEmpty(data)) {data = new ArrayList<>();}//设置标题fileName = URLEncoder.encode(fileName, "UTF-8");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream()).head(clazz).sheet("sheet1").doWrite(data);
}

直接使用该方法可以作为公共的数据的导出接口

如果想要动态的下载任意一组数据怎么办呢?可以使用这个方法

public void exportFreely(String fileName, List<List<Object>> data, List<List<String>> head, HttpServletResponse response) throws IOException {if (CollectionUtil.isEmpty(data)) {data = new ArrayList<>();}//设置标题fileName = URLEncoder.encode(fileName, "UTF-8");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream()).head(head).sheet("sheet1").doWrite(data);}

什么?不仅想一个接口展示全部的数据与信息,还要增加筛选条件?这个后期可以单独解决这个问题。

相关文章:

Spring Boot 一个接口实现任意表的 Excel 导入导出

Java的web开发需要excel的导入导出工具&#xff0c;所以需要一定的工具类实现&#xff0c;如果是使用easypoi、Hutool导入导出excel&#xff0c;会非常的损耗内存&#xff0c;因此可以尝试使用easyexcel解决大数据量的数据的导入导出&#xff0c;且可以通过Java8的函数式编程解…...

华为交换相关

端口模式 &#xff08;1&#xff09;access&#xff1a;只能属于单个VLAN&#xff0c;一般用于连接计算机端口 &#xff08;2&#xff09;trunk&#xff1a;端口允许多个VLAN通过&#xff0c;可以接收和发送多个VLAN报文&#xff0c;默认情况下只有管理VLAN不携带标签信息 &…...

「宇树科技」13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 2025年2月20日&#xf…...

Kafka Snappy 压缩异常分析与解决方案

1. 问题描述 在使用 Kafka 进行消息发送时&#xff0c;遇到了以下异常&#xff1a; org.apache.kafka.common.KafkaException: java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.7-ee0a2284-1d05-4116-9ddc-a0d5d4b3f8cd-libsnappyjava.so: Error loading shared library ld…...

Agent系列——Manus调研

一、Manus核心技术解析&#xff08;代码实现原理&#xff09; 1. 多智能体协同架构 class PlanningAgent: # 任务规划代理def decompose_task(self, task):return ["unzip_files", "extract_info", "match_skills"]class ExecutionAgent: # …...

CS实现票据样式效果

效果图 代码 <template> <div class"outer"><div class"outer-container"></div></div> </template> <script langts> import { reactive, toRefs, onBeforeMount, onMounted } from vue import { useRouter, …...

Maven 简介及其核心概念

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和 依赖管理。 官网: Introduction – Maven 下载地址: Download Apache Maven – Maven 1 Introduction Maven, a Yiddish word meaning accumulator of knowledge, began as an …...

阿里开源的免费数据集成工具——DataX

企业里真实的数据流转是什么样子的呢&#xff1f; 左侧描述了一个企业真实的样子&#xff0c;我们总是需要把数据从一个地方搬到另一个地方&#xff0c;最后就是搬来搬去搬成了一张张解不开的网。 右侧则表达了使用DataX为中心实现数据的同步。 什么是DataX DataX是一个异构…...

医学图像分割数据集肺分割数据labelme格式6299张2类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图像分辨率&#xff1a;1024x1024 图片数量(jpg文件个数)&#xff1a;6299 标注数量(json文件个数)&#xff1a;6299 标注类别数&#xff1a;2 标注类别名称:["leftl…...

Spring IoC的设计与实现

IoC,Inversion of Control 控制反转&#xff0c;将原本由应用程序负责对象创建的工作&#xff0c;交给IOC容器来完成。容器通过依赖注入&#xff08;DI&#xff0c;Dependency Injection&#xff09;来实现。 作用&#xff1a;降低类对象之间的耦合度&#xff0c;减少代码量。…...

微信小程序开发:页面结构与样式设计

微信小程序页面结构与样式设计研究 摘要 微信小程序作为移动互联网的重要应用形式&#xff0c;其页面结构与样式设计对于用户体验和功能实现具有关键作用。本文深入探讨微信小程序的页面结构与样式设计&#xff0c;包括WXML语法与页面结构搭建、WXSS样式编写与页面美化提升以…...

Linux paste命令

目录 一. 简介二. 基本语法三. 小案例 一. 简介 paste 命令用于合并多个文件的行&#xff0c;按列方式输出&#xff0c;默认以制表符&#xff08;Tab&#xff09;分隔。 ⏹基本语法 paste [选项] 文件1 文件2 ...二. 基本语法 <()的方式模拟文件流paste命令将2个文件流粘…...

关于Object.assign

Object.assign 基本用法 Object.assign() 方法用于将所有可枚举属性的值从一个或者多个源对象source复制到目标对象。它将返回目标对象target const target { a: 1, b: 2 } const source { b: 4, c: 5 }const returnedTarget Object.assign(target, source)target // { a…...

新能源汽车充换站如何实现光储充一体化管理?

长三角某换电站光伏板晒到发烫&#xff0c;却因电网限电被迫切机&#xff1b;北京五环充电站每月多缴6万超容费&#xff1b;深圳物流车充电高峰排队3小时...当95%的充换站深陷“用不起绿电、扛不住扩容、算不清碳账”困局&#xff0c;安科瑞用一组真实数据撕开行业潜规则&#…...

Flink 流处理框架的核心特性

文章目录 事件时间支持Flink状态编程一、状态的类型1. 托管状态&#xff08;Managed State&#xff09;2. 原始状态&#xff08;Raw State&#xff09; 二、状态的管理和容错 Flink端到端的一致性1、检查点机制2、幂等3、事务 水位线窗口操作1、窗口类型2、窗口操作的时间语义 …...

蓝桥杯之AT24C02的页写页读

一、原理&#xff1a; 1、页写&#xff1a;一次性向AT24C02里的多个数据存储单元地址写入多个数据 &#xff08;1&#xff09;在AT24C02的页写模式下&#xff0c;每次写入数据后&#xff0c;存储单元地址会自动加1。 &#xff08;2&#xff09;一页有8个数据存储单元&#xff…...

计算机二级web易错点(7)-选择题

在 JavaScript 中&#xff0c;substr() 方法用于从字符串中提取子字符串。它接受两个参数&#xff0c;第一个参数表示开始提取的位置&#xff08;索引从 0 开始&#xff09;&#xff0c;第二个参数表示要提取的字符数量。 在代码 var str"abcdefgh"; alert(str.subs…...

WordPress子主题插件 Child Theme Configurator

一、插件介绍 Child Theme Configurator 是一款强大的 WordPress 插件,专为创建和管理子主题(Child Theme)而设计。使用子主题可以安全地自定义 WordPress 站点,而不会影响原主题(Parent Theme),同时确保主题更新时不会丢失修改。 该插件适用于初学者和高级开发者,提…...

[网鼎杯 2020 白虎组]PicDown1 [反弹shell] [敏感文件路径] [文件描述符]

常见读取路径 /etc/passwd一些用户和权限还有一些乱七八糟的 /proc/self/cmdline包含用于开始当前进程的命令 /proc/self/cwd/app.py当前工作目录的app.py /proc/self/environ包含了可用进程的环境变量 /proc/pid/exe 包含了正在进程中运行的程序链接&#xff1b; /proc/pid…...

基于Spring Boot的乡村养老服务管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…...

Java----正则表达式的学习

正则表达式可以检验字符串是否满足一定规则&#xff0c;并用来校验数据格式的合法性。 在一段文本当中查找满足需求的内容&#xff1a; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Random;import static java.lang.Math.abs; import static…...

为何AI系统比以往任何时候都更需要红队测试

AI 系统已深度融入现代生活&#xff0c;但并非无懈可击。红队测试作为一项关键技术&#xff0c;正通过系统性地挖掘 AI 漏洞&#xff0c;显著提升其安全性与可靠性。随着人工智能技术的快速迭代&#xff0c;这种全面测试的需求愈发迫切&#xff0c;不仅能防范潜在危害&#xff…...

ElementPlus 快速入门

目录 前言 为什么要学习 ElementPlus&#xff1f; 正文 步骤 1 创建 一个工程化的vue 项目 ​2 安装 element-Plus :Form 表单 | Element Plus 1 点击 当前界面的指南 2 点击左边菜单栏上的安装&#xff0c;选择包管理器 3 运行该命令 demo(案例1 &#xff09; 步骤 …...

vue3 ts 请求封装后端接口

一 首页-广告区域-小程序 首页-广告区域-小程序 GET/home/banner1.1 请求封装 首页-广告区域 home.ts export const getHomeBannerApi (distributionSite 1) > {return http<BannerItem[]>({method: GET,url: /home/banner,data: {distributionSite,},}) }函数定…...

[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1)

[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1) 解题过程 打开题目环境 看题目意思应该是让我找备份文件 备份文件一般的后缀名为 .rar .zip .7z .tar.gz .bak .swp .txt .html .bak 直接扫描一下 在url中输入/index.php.bak 弱类型比较 为弱相等&#xff0c;即当…...

信创-人大金仓数据库创建

一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址&#xff1a;https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 ‌ 实例结构 ‌&#xff1a;由数据库文件和 KingbaseES 实例组成。数据…...

【QT】QTCreator测试程序

使用QTCreator实现窗体&#xff0c;其中拟合程度图左侧是测点列表&#xff0c;右侧是改测点的拟合程度图&#xff08;不使用UI&#xff0c;使用代码编写实现&#xff09; 实现思路 创建主窗口&#xff1a;继承 QMainWindow 类来创建主窗口。布局管理&#xff1a;使用 QSplitt…...

Python入门基础

python基础类型转换 str()与int()类型转换 name 张三 age 20 print(type(name),type(age))print(我叫name 今年&#xff0c; str(age)岁 )a10 b198.8 cFalse print(type(a),type(b),type(c)) print(str(a),str(b),str(c))s1 128 f198.7 s276.77 ffTrue s3hello print(type(s…...

Debug-037-table列表勾选回显方案

效果展示&#xff1a; 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能&#xff1a; 在图1中的列表中有三行数据&#xff0c;当点击“更换设备”按钮时&#xff0c;打开抽屉显示el-table组件如图2所示&#xff0c;可以直接回显勾选…...

Zotero·Awesome GPT配置

使用API配置&#xff08;稳定&#xff0c;氪金&#xff09; 配置1-1 &#xff08;方式1&#xff09;在DeepSeek 开放平台获得API Key&#xff0c;输入Awesome GPT的api key中&#xff1b;base api选项选择deepseek&#xff1b;Temperature设置1&#xff0c;Related Number设置…...

在 Simulink 里构建输水隧洞充水过程模型的基本步骤与思路

下面为你介绍在 Simulink 里构建输水隧洞充水过程模型的基本步骤与思路&#xff0c;不过由于没办法直接生成 Simulink 模型文件&#xff0c;这里会给出一个模拟该过程的 Matlab 脚本代码示例。 建模思路 输水隧洞充水过程一般能够用一阶常微分方程来描述&#xff0c;其方程如…...

网络基础梳理

为什么要有网络呢&#xff1f; 在一开始科学家们都是自己在计算机当中做实验但是难免需要共同进行科研。假设现在一个业务需要三个人共同完成&#xff0c;那么现在就有问题了&#xff1a; 由于第一个人完成工作前&#xff0c;其他两人无法开始&#xff0c;这导致工作流程是串行…...

Android开发检查是否是各大厂商手机的工具类

Android开发检查是否是各大厂商手机的工具类 有时需要知道该手机是vivo,oppo,xiaomi,huawei等手机时&#xff0c;需要用到 public class RomUtils {private static final String TAG "Rom";public static final String ROM_MIUI "MIUI";public static …...

系统与网络安全------网络应用基础(2)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 交换机 认识交换机 交换机&#xff0c;Switch 用户将多台计算机/交换机连接在一起&#xff0c;组建网络 交换机负责为其中任意两台计算机提供独享线路进行通信 非网管型交换机 即插即用交换机 即插即用&…...

vue项目配置服务器代理,解决请求跨域问题

在 Vue 项目中配置代理服务器&#xff0c;以下是常见的两种方式&#xff1a; 1、基于vue-cil&#xff08;webpack&#xff09;框架项目 vue.config.js module.exports {devServer: {proxy: {/api: {target: http://xxxxxx.com, // 服务器地址changeOrigin: true,pathRewrit…...

【硬核实战】ETCD+AI智能调度深度整合!从架构设计到调优避坑,手把手教你打造高可用调度系统!

一、核心架构设计&#xff1a;ETCD如何赋能AI调度&#xff1f; &#x1f525; 架构图&#xff1a; [AI调度引擎] ← 实时数据 → [ETCD集群] ↓ 决策指令 [执行层&#xff08;车辆/物流/交通设备&#xff09;] 核心角色&#xff1a; ETCD&#xff1a;存储调度策略、节点状…...

《软件安装与使用教程》— NVIDIA CUDA在Windows的安装教程

《软件安装与使用教程》— NVIDIA CUDA在Windows的安装教程 Installed: - Nsight Monitor Not Installed: - Nsight for Visual Studio 2019 Reason: VS2019 was not found - Nsight for Visual Studio 2017 Reason: VS2017 was not found - Integrated Graphics Frame Debugge…...

Spring的bean生命周期

Spring框架中的bean生命周期指的是在容器中一个bean从创建到销毁的整个过程。以下是Spring中bean的生命周期的主要阶段&#xff1a; 实例化Bean&#xff1a;容器根据bean的定义创建bean的实例。 设值注入&#xff1a;容器通过setter方法或字段直接注入bean的属性。 调用Bean的…...

java执行jar包提示没有主清单属性

以前都没遇到过这种情况&#xff0c;什么时候打jar&#xff0c; war包都没有遇到过&#xff0c; 按照网上说的创建了META-INF/MANIFEST.MF 还是报错 于是检查下maven 打包发现&#xff1a;竟然有skip 为true 去掉 skip true &#xff0c;进行打包&#xff0c;编译后正常...

基于 FPGA的HLS技术与应用

1、hls简介 HLS &#xff08; high level synthesis &#xff09;即高层次综合&#xff0c;主要是利用高级编程语言实现算法。 2、循环优化 约束语法&#xff1a; #pragma HLS unroll #pragma HLS PIPELINE II1 绝大多数循环都以串行的方式执行&#xff0c;这种执行方…...

[笔记] SpringBoot3 使用 EasyExcel 封装工具类实现复杂 Excel 数据处理:使用Java构建高效的数据导入解决方案

文章目录 一. 特殊 Excel 表格例子二. 使用示例1. bo 示例(部分字段)2. 自定义监听器3. 使用方法 三. 实现1. 工具类2. 默认基础导入(特殊 Excel 建立在这个基础上)2.1 Excel 导入监听2.2 默认监听2.3 Excel 返回对象2.3 默认excel返回对象实现 3. 特殊 Excel3.1 单元格位置类3…...

【数据库】sql错题详解

1. 执行子查询 SELECT 供应商号 FROM 订购单 WHERE 职工号 IN (E1, E3) GROUP BY 供应商号 HAVING COUNT(DISTINCT 职工号) 2筛选职工号为 E1 或 E3 的记录&#xff1a; 依据 WHERE 职工号 IN (E1, E3) 这个条件&#xff0c;从 订购单 表中把职工号为 E1 或者 E3 的记录筛选出…...

Three.js贴图技巧:优化性能与效果

引言 在当今数字化的时代&#xff0c;WebGL 技术为开发者们打开了一扇通往交互式 3D 图形世界的大门&#xff0c;而 Three.js 作为JavaScript库中的佼佼者&#xff0c;凭借其简单易用的 API 和丰富的功能&#xff0c;在创建3D场景和交互应用方面得到了广泛应用。在Three.js构建…...

Java Collection API增强功能系列之一 Arrays.asList()

在Java编程中&#xff0c;Arrays.asList() 是一个高频使用却又容易引发陷阱的工具方法。它能够快速将数组转换为列表&#xff0c;但其特殊行为常常让开发者踩坑。本文将深入剖析该方法的本质特性&#xff0c;并揭示其使用时的注意事项。一、方法定义与基础用法 1. 方法签名 p…...

websocket中spring注入失效

一个null指针引发的思考 websocket中spring注入失效 一个null指针引发的思考场景代码SpringBoot入口类配置类websocket类 问题排查问题1&#xff1a;问题2&#xff1a; 反思解决方案一&#xff1a;方案二&#xff1a;方案三&#xff1a;方案四&#xff1a; 场景 首页有个webso…...

Nat Commun:网络结构在塑造神经表征的强度中扮演着‘幕后推手’的角色

摘要 人类通过一系列离散事件构建他们对世界的心智模型。这一过程被称为图学习&#xff0c;它产生了一个编码事件间转移概率图的模型。近期的研究表明&#xff0c;一些网络比其他网络更容易学习&#xff0c;但这种效应的神经基础仍然未知。在这里&#xff0c;本研究使用功能磁共…...

Driver具体负责什么工作

在 Apache Spark 中&#xff0c;Driver&#xff08;驱动程序&#xff09; 是 Spark 应用的核心控制节点&#xff0c;负责协调整个应用的执行流程。它是用户编写的 Spark 应用程序&#xff08;如 main() 方法&#xff09;的入口点&#xff0c;直接决定了任务的调度、资源分配和结…...

LeetCode 热题 100----2.移动零

LeetCode 热题 100----2.移动零 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。示例 1:输入: nums [0,1,0,3,12] 输出: [1,3,12,…...

能源革命新突破:虚拟电厂赋能微电网智能调控,构建低碳生态新格局

在“双碳”目标的引领下&#xff0c;中央一号文件明确提出了“推进农村能源革命&#xff0c;深化绿色低碳技术应用”。作为能耗集中区域&#xff0c;产业园区如何实现清洁能源高效消纳与碳减排的目标成为了难题&#xff0c;中电国为推出的虚拟电厂与风光储充柴多能互补的微电网…...