自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 收藏
  • 关注

原创 基于AOP、Redis分布式锁实现重复提交拦截

重复提交是一个很令人头疼的问题,就算是用户没有恶意,当网络不稳定的时候,用户发表一篇博文或者在注册的时候,数据提交到后台,已入库了,但是前台收不到成功的消息,导致用户重复提交导致库中存在两份甚至多份相同的数据,这不是我们希望看到的,所以有了重复提交拦截。一、导入依赖,分布式锁的实现导入jedis依赖:(用于实现分布式锁的依赖)<dependency> <groupId>redis.clients</groupId> <artifactI.

2022-03-19 14:58:30 885

原创 Dcoker搭建ES以及Logstash

一、docker搭建Elasticsearch拉取es镜像:docker pull elasticsearch:7.6.1查看镜像:docker images运行es容器 ,然后查看容器是否启动docker run -d --name elasticsearch -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:7.6.

2022-03-18 20:31:11 1474

原创 Docker入门实践

关于Docker的理论讲解网上资料还是很多的,马士兵教育讲解的很全面(个人感觉还是可以的哈),大家可以登录B站搜索学习,我们这篇教程偏向于实践操作。关于Docker内核相关的理论知识,个人正在学习,后期会给大家整理一篇相关技术文档,感兴趣的同学可以先参考Docker的官方文档这里采用的是Linux环境下的安装docker操作,基于Centos7一、安装docker所需工具包以及安装源首先我们需要通过安装Docker的组件包,第一个是yum的集合包,提供yum-config-manager实用程.

2022-03-16 22:50:16 774

原创 本地缓存Guava Cache实践

本地 Cache 的老大哥Guava Cache 通过简单好用的 Client 可以快速构造出符合需求的 Cache 对象,不需要过多复杂的配置,大多数情况就像构造一个 POJO 一样的简单。一、Guava Cache实现这里我们是通过CacheLoader的方式来对Guava Cache进行实现,但是它还可以通过Callable的方式实现。/** * @author zheyue * @date 2021/11/3 **/@Slf4j@Servicepublic class Cach.

2021-11-16 11:47:38 413

原创 线程池踩坑记录

线程池原理简单参考:对Java中线程池的理解线程池的创建使用和注意事项1. 手动创建// 线程池创建private ExecutorService threadPoolExecutor = new ThreadPoolExecutor( 10, 20, 1, TimeUnit.MINUTES, new LinkedBlockingDeque<>(10000), new ThreadFactoryBuilder().setNameForma

2021-11-12 11:15:06 479

原创 Arthas—Java诊断工具使用

Arthas 是Alibaba开源的Java诊断工具当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!是否有一个全局视角来查看系统的运行状况?有什么办法可以监控到JVM的实时运行状态?怎么快速定位.

2021-11-05 15:13:11 135

原创 设计模式之策略模式

一、背景:为什么要用到策略模式?阿里开发规约-编程规约-控制语句-第六条 :超过 3 层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现。​普通代码示例:if (a == 1) { ...} else if ( a == 2 ) { ...} else if (a == 3) { ...} else { ...}这种代码虽然写起来简单,但是很明显违反了面向对象的 2 个基本原则:单一职责原则(一个类应该只有一个发生变化的原因):因为之后修改任何一

2021-09-26 11:38:54 151

原创 Java流式编程

最近刚接触项目,发现项目中大量使用流式编程,这里我分享一下流式的几个基本使用方法,自己以前用的并不多,在这里总结一下stream() 流式编程 只是一种风格,当然使用流式实现的功能 for 循环也可以实现,但是它的使用对于我们编写的的代码看起来非常简洁,不像循环那样臃肿。我在这里直接代码演示了:第一种:转为List或者Set String str = "123.456.675.4433.2223"; List<Integer> collect = Arrays.stream.

2021-05-15 15:59:30 353

原创 Tomcat 工作原理解析

一、Tomcat是什么百度百科的解释: Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。其实简单来讲Tomcat是一个web容器。二、Tomcat组成1、server1)Server是一个Catalina Servlet容器;2) Server 可以包含一个...

2021-04-01 14:42:44 210

原创 Spring整体架构知识构建

Spring一、Spring两大核心1、IOC2、AOP二、Spring bean1、Bean的作用域2、线程安全问题3、Bean的生命周期4、循环依赖问题⭐三、Spring 中的事务问题1、四种事务特征(ACID)2、五种隔离级别(比数据库多了一个默认级别)3、七种传播行为一、Spring两大核心1、IOCIOC其实它是一种思想,“控制反转”(官方解释),其实这种思想就是 将原本在我们自己写的程序里面去创建对象的权利,交给Spring框架来管理。IOC容器是Spring 用来实现Ioc的载体,I

2021-03-14 18:02:51 175 1

原创 简析RPC原理

什么是RPCRPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B 部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 HTTP请求当然可以,但是可能会比较麻烦。 RPC 的出现就是为了让你调用远程方法像调用本地方法一样简单。RPC远程过程调用的原理上来贴一张图(这次是自己梳理的,没有盗用大神的,哈哈哈):下面的我们就来说一下这个流程是怎么样

2021-03-08 14:48:58 223

原创 HTTP相关知识总结

HTTP一、引例在浏览器中输入url地址(www.baidu.com),为什么会出现页面二、HTTP长连接,短连接三、HTTP 1.0和HTTP 1.1以及HTTP2.0四、HTTP 和 HTTPS 的区别?HTTPS的一次请求流程超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。HTTP位于应用层。一、引

2021-03-07 21:21:38 223

原创 计算机网络知识体系构建

计算机网络一、OSI七层协议(五层)1、应用层2、运输层3、网络层4、数据链路层5、物理层二、⭐TCP三握四挥1、三次握手2、四次挥手三、TCP、UDP1、区别2、⭐TCP 协议如何保证可靠传输一、OSI七层协议(五层)1、应用层2、运输层3、网络层4、数据链路层5、物理层二、⭐TCP三握四挥1、三次握手2、四次挥手三、TCP、UDP1、区别2、⭐TCP 协议如何保证可靠传输...

2021-03-07 18:19:02 276

原创 Redis知识体系架构(二)

⭐Redis四、过期数据的删除策略1、设置过期时间2、策略五、⭐Redis 内存淘汰机制六、⭐Redis持久化机制七、⭐缓存击穿与缓存雪崩1、缓存击穿2、缓存雪崩八、保证缓存与数据库的一致性九、分布式锁(RedLock)十、分布式集群应用场景(主从+哨兵)四、过期数据的删除策略1、设置过期时间设置过期时间的原因:我们的内存是有限的,如果一直存放的,尽管它能存到磁盘上,但是这些都是又边界的,如果一直存放,那么最终必会导致系统宕机(OOM)过期时间有助于缓解内存的消耗业务场景:短信验证码(比如说一分

2021-03-06 23:28:19 195

原创 Redis知识体系架构(一)

Redis一、分布式缓存技术1、Redis2、Memcached3、缓存数据的处理流程4、为什么要用Redis二、Redis 常见数据结构1、字符串2、list3、hash4、set5、zset(sorted set)三、Redis 单线程模型四、过期的数据的删除策略1、设置过期时间2、策略五、⭐Redis 内存淘汰机制六、⭐Redis持久化机制七、⭐缓存击穿与缓存雪崩1、缓存击穿2、缓存雪崩八、保证缓存与数据库的一致性九、分布式锁十、分布式集群应用场景(主从+哨兵)一、分布式缓存技术1、Redis2

2021-03-06 22:18:08 243 1

原创 Mysql体系知识总结

MYSQL一、存储引擎1、InnoDB(Mysql 5.5以后默认的存储引擎)2、MyISAM(5.5以前默认)二、索引1、为什么使用索引2、哈希索引3、BTree索引(B+树)4、聚簇索引与非聚簇索引5、注意点6、最左前缀原则三、事务1、四大特性(ACID)2、并发事务带来的问题3、事务的隔离级别四、Mysql中的乐观锁和悲观锁1、悲观锁2、乐观锁五、数据库连接池MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了

2021-03-05 22:02:02 528 1

原创 深入理解CAS与AQS

CAS与AQS一、CAS1、什么是CAS2、CAS进行原子操作的三大问题3、循环CAS二、AQS1、核心思想2、具体实现3、AQS 对资源的两种共享方式4、AQS 的应用一、CAS1、什么是CAS首先,CAS是一种算法,不是锁CAS,其实是个简称,全称是 Compare And Swap,对比之后交换数据CAS的实现原理首先呢,我们通过它的全称就可以看出来,CAS先是对比数据,然后再执行具体的原子操作。几个参数介绍:this:Unsafe 对象本身,需要通过这个类来获取 valu

2021-03-03 21:04:20 442 2

原创 Java线程池

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。一、使用线程池的好处在开发过程中,合理地使用线程池能够带来3个好处。降低资源消耗通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。二、线程池的实现原理线程池处理.

2021-03-02 17:54:14 245

原创 ConcurrentHashMap的实现原理

一、为什么要是用ConcurrentHashMap在并发编程中使用HashMap可能导致程序死循环(这是在JDK1.7中,在JDK1.8中导致的线程不安全主要是put方法可能会导致值被覆盖)。而使用线程安全的HashTable效率又非常低下(全表数据被synchronized修饰),基于以上两个原因,便有了ConcurrentHashMap的登场机会。1、HashMap线程不安全HashMap原理请参考:HashMap原理JDK1.7线程不安全主要体现在发生扩容的时候,重新哈希(rehas

2021-03-02 00:53:34 407 7

原创 深入理解 “死锁“

死锁理解一、什么是死锁二、长生死锁的条件三、如何避免死锁1、第一种方式2、第二种方式(拓展)一、什么是死锁死锁为两个或两个以上的线程在执行过程中,由于竞争资源而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。举个例子(个人理解):就是比如说两个线程:线程A、线程B,各自持有自己的资源(A持有资源a,B持有资源b),当A需要资源b,B需要资源a。但是此时A抓着a资源不放,B抓这b资

2021-02-28 21:58:36 174 1

原创 Java设计模式之单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。一、单例模式介绍从上面的定义中我们可以得知单例模式具有以下几点特征:单例类只能有一个实例单例类必须自己创建自己的唯一实例(不需要外部实例化该类对象)单例类必须给所有其他对象提供这一实例.

2021-02-27 22:53:58 123

原创 JS应用小知识:$(‘#content‘).html(‘‘) 与 $(‘#content‘).empty()两种方式清除

我们在开发中有很多时候需要利用js来对一个dom元素进行清除操作,比如说清除input框中的内容,input绑定的id为 “content”,那么我们会有三种方式进行清除。js原生方式进行清除document.getElementById("content").value="";其他标签的话是(比如说span标签):document.getElementById("tagName").innerHTML="";jquery实现方式// 第一种方式$('#content').html('

2021-02-25 23:54:42 1812

原创 深入理解Java虚拟机(五):终结篇

本篇我们主要总结一下运行时栈帧结构以及编码器优化技术。一、运行时栈帧结构Java虚拟机以方法作为最基本的执行单元,“栈帧”(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。每 一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址和一些额外的附加信息。在这里我们主要讲.

2021-02-25 23:44:17 111 2

原创 深入理解Java虚拟机(四)

这里我们主要总结一下Java虚拟机中的 类加载机制Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。一、类加载的生命周期一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化 (Initialization)、使用(Usi.

2021-02-24 22:23:22 139

原创 深入理解Java虚拟机(三)

我们主要介绍一下垃圾收集器。本章主要介绍经典垃圾收集器如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。新生代收集器1、Serial收集器 (Serial中文翻译为:依次的,顺序的)大家只看名字就能够猜到,这个收集器是一个单线程工作的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。简单而高效(与其他收集器的单线程相比)客户端模式默认收集器采用复.

2021-02-23 18:39:18 175 2

原创 深入理解Java虚拟机(二)

第二篇,主要来说一下Java虚拟机的垃圾收集算法。一、判断对象是否 “已死”在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)。判断对象是否 “已死” 有两种算法:引用计数算法在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。引用计数算法有一个缺点就.

2021-02-22 22:33:32 187 4

原创 深入理解Java虚拟机(一)

在此之前我们先来看一下JDK和JRE。我们可以把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development Kit),JDK是用于支持Java程序开发的最小环境。可以把Java类库API中的Java SE API子集和Java虚拟机这两部分统称为 JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。Java内存区域一、运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分.

2021-02-22 19:18:55 1258 11

原创 Java核心技术卷知识点总结

基本数据类型byte(1字节,8位)short(2字节,16位)int(4 字节 32位)long(8字节 , 64位)float(4字节 32位)double(8字节 , 64位)char(2字节 16位)boolean(4字节 32位)面向对象的特点面向对象的三大特点:继承、封装、多态面向对象就是将一个模块或者是一个完整需求按照某些特点或者功能进行拆分,将具有共有特性的封装到一起,可以独立进行操作的这种低耦合、易扩展维护的思想多态,简述多态多态简单来..

2021-02-21 21:10:07 209

原创 String、StringBuffer、StringBuilder的区别

String:我们对String都不陌生,相信大家也都知道String是不可变的,那么他为什么是不可变的呢?我们通过研究String的源码就不难发现String类已经被final修饰,并且它的 value[] 成员也被final修饰了,我们知道,String存取字符串是将他们一个一个的存到了字符数组里面,所以这也是最重要的String为什么是不可被修改的原因。拓展:final有哪些作用呢?final修饰的类不可被继承;final修饰的方法不可被重写;final修饰的常量不可被修改;在并发的时候,fina.

2021-02-19 20:36:09 110

原创 RBAC权限系统分析、设计与实现

目前,使用最普遍的权限管理模型正是RBAC(Role-Based Access Control)模型,这些文章也主要是介绍基于RBAC的权限管理系统,这篇文章从RBAC是什么、如何设计RBAC两部分来介绍。我所负责的项目涉及到角色权限的问题全部是通过RBAC来实现的,以前只是出于熟练使用的层面,现在学习一下RBAC更深层次的理论知识。一、RBAC是什么1、RBAC模型概述RBAC认为权限授权的过程可以抽象地概括为:Who是否可以对What进行How的访问操作,并对这个逻辑表达式进行判断是否为.

2021-02-14 20:09:06 898

原创 SpringBoot中应用 微信授权登录

总结项目的过程中,这是一个自己探索的点,项目用到了微信授权登录的功能,因为之前没有做过,所以自己也是在网上搜集了很多资料,现在分享给大家。其实类似于微信授权登录的其他三方登陆,原理是一样的。现在我们就来看一下这是怎么实现的,其实很简单。首先我们在访问登录页面的时候,就去调用微信官方给我们提供的接口,我们需要提供几个参数,分别是 openid、appid、redirect_uri(重定向链接)下面看返回登录界面的controller代码一开始这一部分是我用到的一些跟业务相关的代码,大家可.

2021-02-04 10:04:06 740 5

原创 使用nginx配置https

我们都知道一开始我们的域名解析到对应的服务器(ip),这时候我们的链接是不安全的,我们发现https是安全的连接,那么我们就来配置https。大家可以参考我之前的文章进行安装nginx:Linux安装nginx参考:http 与 https 的区别以及加密详解首先我们的服务器上要配置nginx,利用nginx来配置我们的https,来达到我们的连接是安全的目的。(如下图所示)服务器上安装好nginx以后吗,我们需要去购买https证书,当然我们可以在阿里云上购买免费的证书来进行测试。购买.

2021-01-31 11:25:41 1111 3

原创 SpringBoot中应用@Transactional注解对事务控制的管理(不要滥用)

我们在开发过程中事务是无法回避的一个问题,什么是事务呢?简单来讲就是 “要么都成功,要么都失败”;典型案例就是我们在做支付的时候,如果没有失误控制,那么就有可能发生故障,比如说我在支付的过程中,突然出现了断网,我这边的钱扣出去了,但是对方却没有收到钱,这是极其严重的。抛开支付,我们在开发的过程中,涉及到两张及以上表的修改操作时,也是需要考虑事务的。那么我们怎么去控制呢?使用 @Transactional 注解去解决@Transactional 是声明式事务管理 编程中使用的注解@Trans.

2021-01-29 12:47:52 641 1

原创 SpringBoot接入支付宝支付功能(沙箱操作)

官网给出的例子,跑到自己本地如下图:一、前期准备进入开放平台,沙箱环境,登录,一开始需要填写基本信息下载支付宝开放平台开发助手,生成密钥需要用到配置参数保留appId 和 支付宝网关,后面我们会用到生成密钥(打开我们下载的开发助手), 保留公钥和私钥将公钥配置到我们的沙箱环境中,保留最后的支付宝公钥,后面我们会用到二、项目应用后台代码编写 AlipayConfig.java 类,里面设计的参数,我们前一步都获取到了,填写到对应位置就可以了.

2021-01-28 18:35:46 541

原创 Linux环境下安装 RabbitMQ

Linux环境以 centos 7 为基础进行安装RabbitMQ是在Erlang环境下运行的,所以我们首先需要安装Erlang环境首先我们分别需要下载erlang环境和RabbitMq的rpm源需要注意的就是我们需要对应他们的版本我下载的是最新的,所以给出大家最新的下载地址erlang下载链接 https://www.erlang-solutions.com/resources/download.htmlrabbitmq下载链接 https://www.rabbitm.

2021-01-20 17:40:49 148

原创 SpringBoot 创建 定时任务

项目中创建定时任务是一种常见并且常用的技术,近几天我在整理项目的过程中,整理了springboot中通过@Scheduled 来创建定时任务,希望可以帮到大家,同时我也做一个记录。首先我们需要两个注解来书写我们的定时任务的类,我这里的场景是清除数据库中已经废弃了的 ‘房间’ 的信息,这两个注解分别是:@Component :将这个类放到spring ioc 容器中来帮助我们管理这个类@Scheduled :开启定时任务,应用于方法上这个类的代码如下/** * @ClassName .

2021-01-20 14:11:15 148 1

原创 Linux环境下安装 nginx (两种方式)

一、centos7 安装nginx安装相应依赖包yum install -y wgetyum install -y vim-enhancedyum install -y make cmake gcc gcc-c++yum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-devel官网下载对应的压缩包,并解压 http://nginx.org/en/down

2021-01-19 15:55:36 188

原创 Spring Boot 应用切面Spring AOP以及AOP机制的简单理解

切面应用场景:日志记录,加密解密,token令牌验证等等我在这里应用到的是 token令牌验证 ,来验证当前我这个app端用户在调用后台接口的时候是否是已登录状态,没有登陆(没有token或者token失效)的用户是不允许访问对应接口的上述场景是需要切面来验证的,否则的话每一个需要验证的接口都需要调这个公共方法时会产生代码混乱以及代码分散的情况,同时基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高.

2021-01-18 13:34:21 210

原创 算法题解:蛇形矩阵

题目描述输入两个整数n和m,输出一个n行m列的矩阵,将数字 1 到 n*m 按照回字蛇形填充至矩阵中。输入格式输入共一行,包含两个整数n和m。输出格式输出满足要求的矩阵。矩阵占n行,每行包含m个空格隔开的整数。数据范围1≤n,m≤100输入样例:3 3输出样例:1 2 38 9 47 6 5思路:图形如下一开始是从 (0 ,0)点出发,按照右(偏移量为(0 ,1):x不变,y加一)→ 下(偏移量为(1 ,0):x加一,y不变)→ 左(偏移

2021-01-17 16:25:13 791 3

原创 EasyExcel 的读写使用

最近在总结项目项目中用到的知识点,EasyExcel 是一个技术点:EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。我之前用过apache的poi技术来读取本地的excel文件,但是他有一个显著的缺点就是 在处理的数据非常多的时候,非常消耗内存,并且很容易出现异常的情况,所以在选择技术工具的时候选择了阿里的easyExcel。因为我负责的项目采用的是spring boot框架,所以我这里主要讲解一下如何在spring .

2021-01-16 12:10:02 410

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除