自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Apollo的博客

研究过视觉算法的JAVA后端工程师!

  • 博客(56)
  • 资源 (4)
  • 收藏
  • 关注

原创 领域驱动设计实践:以DDD视角看SOFA

一、前言最近在蚂蚁接触了一段时间的SOFA,决定写一篇文章记录下学习心得。DDD是2004年被提出的,那时的程序还仅仅是部署单机。到了2014年,SOA大行其道,微服务的概念开始冒头,而如何将一个应用合理的拆分为多个微服务成为了各大论坛的热门话题而DDD里面的Bounded Context(限界上下文)的思想为微服务拆分提供了一套合理的框架。二、概念1. 领域+驱动+设计在《领域驱动设计》一书中,作者 Eric Evans 讲过:在项目的最初阶段,需要业务,产品和技术同时参与进来。尽可能用建模语言把

2021-06-09 21:54:19 2569 6

原创 ThreadLocal详细讲解

标题ThreadLocal详细讲解(小白都能看懂)一、ThreadLocal的作用:我初始化一个ThreadLocal变量target,初始值即为null;在进程1里,我将它设为1;在进程2里,我获取这个初始值,他还是null,同时我将它设成3;在进程3里,我获取它,还是null。各个进程对于这个变量的操作都是独立的。二、ThreadLocal源代码讲解1.创建ThreadLocal对象。ThreadLocal<Integer> target = new ThreadLoca

2021-01-06 17:51:20 18513 8

原创 JVM快速入门(下)

前言    这篇文章是对JVM快速入门(上)的补充,没有看上一篇的小伙伴可以去温习一下。这一篇文章的内容主要针对JVM堆内存来讲讲垃圾回收。一、JVM内存关于JVM内存,推荐Java堆内存又溢出了!教你一招必杀技简而言之JVM堆内存分为堆内存与永久代(后被元空间代替,元空间在物理内存),堆内存可能会发生OOM所以需要垃圾回收。JVM内存划分为堆内存和非堆内存,堆内存分为年轻代(Young Generation)、老年代(Old Generation),

2021-01-04 13:24:44 18383 3

原创 JVM快速入门(上)

前言    根据狂神说的JVM快速入门做了以下笔记,讲的很好的一个博主,给小伙伴们附上视频链接狂神说JVM快速入门    接下来我按照他所讲的内容给大家记录一些重点!一、JVM体系结构    .java经由javac变为class字节码文件,再通过类加载器加载.对于类加载器我根据南淮北安博主的文章进行了总结.1.类加载器    我们都知道

2021-01-02 21:47:59 26660 23

原创 springboot手动引入jar包的方式

1、将jar包手动放到resource-lib里,修改pom.xml的设置参考文章https://blog.csdn.net/weixin_46724181/article/details/1226434372、将jar包下载后,通过IDE手动在模块中加入依赖文件https://zhuanlan.zhihu.com/p/3384749133、将jar包安装到本地maven仓库,通过IDE中的mvn installhttps://www.jb51.net/article/194928.htm.

2022-04-15 15:17:23 5270

原创 Vue中调用函数加括号与不加括号区别

https://blog.csdn.net/qq_40436854/article/details/103923544https://www.jianshu.com/p/f35a9848dd22在做项目的时候,引入了element-ui的分页功能 发现了问题1、getList方法定义:page=1相当于不传参时page默认为12、以下方法不能加(),不加括号页数可以依靠前端组件传入,若写为getList(),则无论前端点多少页,始终维持在第一页。若写为getList(2),则始终保持在第二页3

2022-03-27 12:05:58 2933

原创 跨域问题的原因及解决对策

内容来自两篇非常好的文章https://zhuanlan.zhihu.com/p/145837536https://zhuanlan.zhihu.com/p/66484450跨域问题的由来相信很多人都或多或少了解过跨域问题,尤其在现如今前后端分离大行其道的时候。你在本地开发一个前端项目,这个项目是通过 node 运行的,端口是9528,而服务端是通过 spring boot 提供的,端口号是7001。当你调用一个服务端接口时,很可能得到类似下面这样的一个错误:然后你在发送请求的地方debug

2022-03-25 11:37:50 2966

转载 JSON 与 JS 对象的区别与对比

JSON字符串与JSON对象的区别原文https://www.haorooms.com/post/json_object_json_string本篇文章是对javascript、js操作json方法总结 http://www.haorooms.com/post/js_jsons_h 这篇文章的补充说明,有朋友问JSON字符串与JSON对象的区别,下面说一下。JSON对象是直接可以使用JQuery操作的格式,和js中的对象一样,可以用对象(类名)点出属性(方法)。JSON字符串仅仅只是一个字符串,一个

2022-03-22 17:27:11 526

原创 三月学习随记

Spring注解@Target、@Retention、@Document注解简介https://www.cnblogs.com/xushuanglong/p/14470076.html@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface MthCache { String key();}@Target 注解功能:指明了修饰的这个注

2022-03-14 15:59:42 151

原创 MySQL语句执行过程以及三大日志

前言当初看MySQL45讲时做的笔记,发布出来记录下自己的学习心得吧。查询缓存连接建立完成后,你就可以执行select语句了。执行逻辑就会来到第二步:查询缓存。MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成

2021-09-16 21:51:08 1486

原创 类实例与类的垃圾回收

前言近期在蚂蚁金服接触了SOFAArk,其中涉及到类的动态装配与卸载,对垃圾回收有了进一步的理解。类的生命周期https://blog.csdn.net/xorxos/article/details/80490240 当类被加载、连接和初始化后,它的生命周期就开始了。(注意这一步是类加载的过程)当代表类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,类在方法区内的数据也会被卸载,从而结束类的生命周期。 由此可见,一个类何时结束生命周期,取决于代表它的Class对象何时结

2021-08-15 19:18:12 966 3

原创 对项目上线过程的思考

前言项目上线的过程往往不是一蹴而就,需要一个循序渐进的过程来实现风险最低化,接下来我对公司中一个项目的上线过程进行总结。上线过程正常项目上线需要经历几个阶段预发 -> 灰度平台 -> 线上发布预发测试人员自己测试,测试覆盖率等指标灰度平台在灰度环境下,观察项目有无问题,通常灰度时间就能达到1天。灰度平台中可进行灰度发布,一批批服务器开始推,出现问题及时止血(灰度平台中可以推的比生产环境快)。同时灰度流量可以有多种方式,例如虚拟流量进行压测,或是调取部分真实流量作为灰

2021-05-26 19:44:01 362

原创 kepler利用udtf将json多行输出

前言接到了一个实时计算的需求,大致是一个流式计算,需要将DRC提取到的变更数据进行过滤与数据处理后落库。之前也没有接触过大数据,因此对阿里的kepler进行了学习,在此总结。流式计算在日常生活中,我们通常会先把数据存储在一张表中,然后再进行加工、分析,这里就涉及到一个时效性的问题。如果我们处理以年、月为单位的级别的数据,那么多数据的实时性要求并不高;但如果我们处理的是以天、小时,甚至分钟为单位的数据,那么对数据的时效性要求就比较高。在第二种场景下,如果我们仍旧采用传统的数据处理方式,统一收集数据,存储

2021-05-14 16:18:00 420 1

转载 对SpringBean生命周期的理解

1、为什么要理解Bean的生命周期https://blog.csdn.net/yjc0403/article/details/84831832Bean的生命周期可以理解为Bean从产生到销毁的过程,中间涉及到了实例化、属性注入、初始化等流程,同时后置处理器BeanPostprocessor穿插执行,只有了解了这个过程,才能在Bean生产过程中进行一些定制化操作。以beanPostProcessor为例:背景公司有一个线上数据源加密包, 这个包是在原开源包基础上修改了源码把明文的password设置

2021-05-12 17:13:01 350

原创 InnoDB表结构与页结构详解

前言写这篇文章的初衷是为了探索数据在InnoDB中如何存储的,文章从表在InnoDB中的存储形式讲到页的结构,以及索引树与页的关系,页分裂问题等。一、InnoDB表结构从MySQL 5.6版本开始innodb_file_per_table参数默认设置为1。该配置下你的每一个表都会单独作为一个文件存储(如果有分区也可能有多个文件)。在MySQL的设定中,同一个表空间内的一组连续的数据页为一个extent(区),默认区的大小为1MB,页的大小为16KB。16*64=1024,也就是说一个区里面会有64个连

2021-04-24 14:49:14 1161 2

原创 对象锁和类锁的区别

对实例对象和类加锁的区别class Account { private int money; public Account(int money) { this.money = money; } public sell(){}}Account a = new Account(2000);Account b = new Account(2000);实例锁即sycronized(this),加载实例对象上,不同的实例对象之间的锁不冲突.当sell加了

2021-04-15 15:37:22 1731

原创 七种单例模式写法即介绍

参考文章https://blog.csdn.net/mnb65482/article/details/80458571https://blog.csdn.net/itachi85/article/details/50510124定义保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式结构图:首先我们要先了解下单例的四大原则:1.构造私有。2.以静态方法或者枚举返回实例。3.确保实例只有一个,尤其是多线程环境。4.确保反序列换时不会重新构建对象。我们常用的单例模式有:饿

2021-04-13 00:36:27 401

原创 局部变量与成员变量的线程安全分析

局部变量与成员变量的线程安全分析前言观看黑马程序员全面深入学习java并发编程遇到了疑问,进行总结,同时发现了一篇文章写的也不错,是根据视频进行的总结。https://blog.csdn.net/m0_37989980/article/details/111400237线程安全分析成员变量和静态变量是否线程安全? 如果它们没有共享,则线程安全 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安

2021-04-08 09:54:06 1484 4

原创 字符串常量和字符串对象区别

前言String s1 = new String(“hello”);String s2 = “hello”;s1是字符串对象,s2和字符串常量,创建过程有何区别?内存分配字符串对象s1栈中定义一个引用变量s1,堆中开辟一个内存空间,将堆内存空间的引用赋值给s1,“hello”是常量,去字符串常量池查看是否有“hello”字符串对象,没有的话分配一个空间存放hello,并且将其空间地址存入堆中new出来的空间中。字符串常量s2栈中定义一个引用变量s2,编译程序先去字符串常量池检查,是否存在“h

2021-03-31 09:58:41 1408 2

原创 Tomcat到Servlet再到DispatcherServlet

前言写这篇文章的初衷其实是上一篇文章之后的想法,在TCP/IP五层模型视角下的浏览器请求中我以TCP/IP五层模型的视角分析了浏览器请求的传输过程,浏览器输入的url经过http封装后到达服务端TCP层后,得到的是个http请求,那么在服务端怎么对这个消息进行处理并返回响应?先上结论,Tomact的Connector会监听端口,接受TCP请求并产生一个线程来处理这个请求,把产生的 Request 和 Response 对象传给后续步骤,最后Connector会返回HttpServletResponse,

2021-03-30 11:13:31 3139 2

原创 TCP传输的数据切片与ACK介绍

前言写这篇文章的初衷是为了总结TCP传输过程,利用Socket抓包进行测试。、重点探讨了传输层的数据切片以及接受包后的ACK机制。TCP传输示例上方是三次握手建立连接红框为传数据下方四次挥手断开连接注意传输的TCP数据部分最大即1460字节,因为在传输层进行了分片。MTU为1500,考虑到数据链路层传输限制,要保证最大长度为MTU - IP首部(20) - TCP首部(20)。IP数据包分片参考文献https://my.oschina.net/xinxingegeya/blog/48

2021-03-28 17:16:24 6716

原创 TCP/IP五层模型视角下的浏览器请求

浏览器请求的传输过程前言以应用层、运输层、网络层、链路层、物理层的视角,详细分析了浏览器请求到服务端的传输过程,其中特意区分了网络层与链路层的区别。浏览器输入网址在浏览器中输入一个网址www.taobao.com应用层1.DNS解析域名,得到ip地址2.HTTP或HTTPS封装传输层其实传输控制层的作用主要是产生包。产生握手包,数据切片包,挥手包等,怎么发不归他管,归网络层链路层物理层。TCP或UDP协议,若是TCP则进行三次握手连接。同时在传输层通常会对数据报文进行切片,去掉TCP头

2021-03-28 17:00:20 695

原创 BIO/NIO/多路复用/Selector/select/poll/epoll

前言进行总结的初衷是没搞明白linux下的select/poll/epoll与java下nio的selector多路复用器的关系,于是对知识点进行了梳理。先上结论,selector多路复用器算是对linux下的select/poll/epoll进行封装,selector可以i有多种实现,linux系统下默认使用epoll的实现方式。BIO模型https://www.jianshu.com/p/138847d5cafdBIO即为阻塞IO的意思,通常我们讲BIO的时候都会和服务器模型配合着讲,在实际应

2021-03-27 19:27:40 1740 4

原创 SpringMVC如何处理请求

前言在浏览器输入url地址后回车,请求是怎样被处理并返回的?带着这个问题我对SpringMVC的执行过程进行了一下梳理。框架SpringMVC的原理如下图所示:​ 当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器(Controller)处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。上面的图可能不太直观,看看下面这张图,实现表示SpringMVC帮我们做的,

2021-03-01 20:19:33 1305

原创 线程与线程池创建详解

前言近期面试时被问得比较多的线程池,现在进行一个总结1.创建线程方式java有以下四种创建多线程的方式(具体可参考https://blog.csdn.net/jinxinxin1314/article/details/105695860)1:继承Thread类创建线程2:实现Runnable接口创建线程3:使用Callable和FutureTask创建线程4:使用线程池,例如用Executor框架创建线程Callable和Runnable都可以应用于executors。而Thread类

2021-02-27 15:20:34 822 2

原创 同步/异步/阻塞/非阻塞 IO

前言对于NIO以及同步异步的理解不是很深刻,对知识点进行了一下梳理,同时推荐一篇不错的文章!https://blog.csdn.net/twt936457991/article/details/89668350Q1:同步/异步/阻塞/非阻塞 IO 的区别?同步和异步是通信机制,阻塞和非阻塞是调用状态。同步同步 IO 是用户线程发起 IO 请求后需要等待或轮询内核 IO 操作完成后才能继续执行。异步异步 IO 是用户线程发起 IO 请求后可以继续执行,不等待内核 IO 操作的完成,当内核 IO

2021-02-25 11:00:52 1007

原创 volatile的可见性和有序性以及对比syncronized

引言面试京东的时候对这个知识点有点遗忘,现在进行一下总结。JMM(Java内存模型)在 JDK1.2 之前,Java 的内存模型实现总是从主存(即共享内存)读取变量,是不需要进⾏特别的注意的。⽽在当前的 Java 内存模型下,线程可以把变量保存本地内存(⽐如机器的寄存器)中,⽽不是直接在主存中进⾏读写。这就可能造成⼀个线程在主存中修改了⼀个变量的值,⽽另外⼀个线程还继续使⽤它在寄存器中的变量值的拷⻉,造成数据的不⼀致。volatile的可见性jvm知道这个变量是使用volatile修饰,那么他

2021-02-24 22:03:45 385

原创 ArrayBlockingQueue源码详解

阻塞队列插入方法:add(E e) : 添加成功返回true,失败抛IllegalStateException异常offer(E e) : 成功返回 true,如果此队列已满,则返回 false。put(E e) :将元素插入此队列的尾部,如果该队列已满,则一直阻塞删除方法:remove(Object o) :移除指定元素,成功返回true,失败返回falsepoll() : 获取并移除此队列的头元素,若队列为空,则返回 nulltake():获取并移除此队列头元素,若没有元素则一

2021-02-20 19:31:10 637 1

原创 SpringIOC的深入理解

SpringIOC要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle )。什么是依赖倒置原则?假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。这样的设计看起来没问题,但是可维护性却很低。假设设计完工之后,上司却突然说根据市场需求的变动,要我们

2021-02-19 12:21:11 1251 1

原创 TCP滑动窗口

TCP滑动窗口参考https://blog.csdn.net/yao5hed/article/details/81046945https://blog.csdn.net/ligupeng7929/article/details/79597423https://blog.csdn.net/h2604396739/article/details/85239439概述滑动窗口实现了TCP流控制。首先明确滑动窗口的范畴:TCP是双工的协议,会话的双方都可以同时接收和发送数据。TCP会话的双方都各自维护一

2021-02-18 15:15:21 1747

原创 synchronized锁升级及锁优化

一、锁升级在1.6之前java中不存在只存在重量级锁,这种锁直接对接底层操作系统中的互斥量(mutex),这种同步成本非常高,包括操作系统调用引起的内核态与用户态之间的切换。线程阻塞造成的线程切换等。因此在jdk 1.6中将锁分为四种状态:由低到高分别为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。1. 偏向锁。什么是偏向锁呢?为什么要引入偏向锁呢?​ 偏向锁是如果一个线程获取到了偏向锁,在没有其他线程竞争的情况下,如果下次再执行该同步块时则只需要简单判断当前偏向锁所偏向的对象是否

2021-02-17 23:03:08 1294

原创 MySQL索引-B+树

索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在 [1,2,3,4] 中找到 4 这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在 MySQL 数据库中分三类:B+ 树索引Hash 索引全文索引我们今天要介绍的是工作开发中最常接触到的 InnoDB 存储引擎中的 B+ 树索引。要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种数据结构。

2021-02-14 21:23:39 1258 2

原创 线程的六种状态以及sleep/wait/yield/join的区别

一.线程通常有五种状态:新建状态(New):新创建了一个线程对象。就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待 获取CPU的使用权。运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。5.死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程

2021-02-13 14:03:41 1590 1

原创 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

前言在编程世界里,「锁」更是五花八门,多种多样,每种锁的加锁开销以及应用场景也可能会不同。如何用好锁,也是程序员的基本素养之一了。高并发的场景下,如果选对了合适的锁,则会大大提高系统的性能,否则性能会降低。所以,知道各种锁的开销,以及应用场景是很有必要的。接下来,就谈一谈常见的这几种锁:正文多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,所以我们通常为了解决这一问题,都会在访问共享资源之前加锁。最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同

2021-02-10 10:04:56 1700

原创 MySQL的可重复读、幻读及实现原理

目录一、事务的隔离级别二、mysql怎么实现的可重复读举例说明MVCC的实现MVCC逻辑流程-插入MVCC逻辑流程-删除MVCC逻辑流程-修改MVCC逻辑流程-查询三、幻读快照读和当前读四、如何解决幻读事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读的?为什么会出现幻读?是否解决了幻读的问题?一、事务的隔离级别Read Uncommitted(未提交读)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(D

2021-02-08 23:30:53 5693 1

原创 PriorityQueue优先级队列用法

用法先说结论,JAVA中默认是小根堆,即小的在堆顶(poll时小的出去)接下来看下默认的最小堆写法PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2){ return o1 < o2 ? -1 : 1; // 最小优先队列,直接 re

2021-02-08 12:58:26 6304

原创 十大经典排序算法总结

十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。各排序算法复杂度及稳定性:相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:1.时

2021-02-07 23:40:50 19614 1

原创 冒泡排序

冒泡排序算法原理比较相邻的两个元素,如果前者比后者大(反之倒序),则交换。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。针对所有的元素重复以上的步骤。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。例:给出数列{9,6,1,3,5}先排数字9,以此比较与交换 然后是数字6 数字1比3小,3比5小 ,所以5不动以此类推1,3不动代码:#include<iostream>void Bubble_

2021-02-07 23:32:34 9903

原创 快速排序的时间复杂度和空间复杂度

我们来分析一下快速排序法的性能。快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况。如图9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快速排序过程中的递归过程。由于我们的第一个关键字是50,正好是待排序的序列的中间值,因此递归树是平衡的,此时性能也比较好。空间复杂度,主要是递归造成的栈空间的使用,最好情况,递归树的深度为logn其空间复杂度也就为 O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(

2021-02-07 22:43:18 15663

原创 狂神说SpringBoot最全笔记

目录狂神说SpringBoot01:Hello,World!狂神说SpringBoot02:运行原理初探狂神说SpringBoot03:yaml配置注入狂神说SpringBoot04:JSR303数据校验及多环境切换狂神说SpringBoot05:自动配置原理狂神说SpringBoot06:自定义starter狂神说SpringBoot07:整合JDBC狂神说SpringBoot08:整合Druid狂神说SpringBoot09:整合MyBatis狂神说SpringBoot10:Web开

2021-02-07 10:52:56 25463 7

SpringMVC狂神说最全笔记

根据SpringMVC狂神说公众号做的笔记,把他做成了md方便大家阅读

2021-01-29

MyBatis狂神说最全笔记

根据狂神说狂神说狂神说视频复现的一模一样的笔记

2021-01-24

狂神说Spring5最全笔记

根据狂神说狂神说Spring5视频复现的一摸一样的笔记

2021-01-13

空空如也

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

TA关注的人

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