自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 手撸简易spring框架(五)

目录前言DispatcherServletHandlerMappingHandlerAdapterViewResolverdoDispatch成果展示最后前言这次我们来完成MVC的模块,最终目标需要达到用户能够使用Controller,浏览器能够显示模板引擎渲染的结果。为了能够解析前端的HTTP协议请求,需要在项目POM中引入Servlet。<!--引入Servlet--><dependency> <groupId>javax.servlet</gr

2021-03-11 18:32:43 230

原创 手撸简易spring框架(四)

目录前言JoinPointMethodInterceptorAdvice实现多种通知类型AopProxy对象实例化前创建代理成果展示最后前言这次我们来完成AOP的流程,有一定的困难,大家做好准备,也希望笔者能用最简洁的语言给大家讲明白。如果读者不太了解Spring的AOP原理,可以先看《面试问烂的 Spring AOP 原理、SpringMVC 过程》这篇文章。文章中有张关于AOP执行的流程图 ,这里把它引用过来,往下阅读前最好能理解这段流程。JoinPoint通知方法的其中一个入参就是JoinP

2021-03-11 18:31:25 155

原创 手撸简易spring框架(三)

目录前言非懒加载的提前初始化初始化核心方法getBean依赖注入中段成果展示最后前言上一章fresh()中还差第4步“Bean实例化”没有完成,这一章就来搞定它,大名鼎鼎的DI依赖注入也会在这Bean实例化的过程中完成。非懒加载的提前初始化这是fresh()的最后一步,逻辑是遍历BeanDefinition集合,将非懒加载的Bean提前初始化。public void refresh() throws Exception { //1、定位,定位配置文件 reader = new B

2021-03-11 18:30:21 177

原创 手撸简易spring框架(二)

目录前言读取配置文件扫描配置文件封装成BeanDefinition注册到容器最后前言上一篇文章已经将整体的脉络搭建出来了,这次正式开始手写IOC。ApplicationContext中的refresh()方法是Spring启动的关键,我们就从这里开始一步步开始填坑。读取配置文件在DefaultApplicationContext中,我们先完成第一步,定位和解析配置文件。private void refresh() throws Exception { //1、定位,定位配置文件 r

2021-03-11 18:29:11 140

原创 手撸简易Spring框架(一)

目录前言效果预览IOC和DI类图AOP类图MVC类图最后前言相信大家平常开发中已经有过大量使用Spring的经验,爱学习的同学肯定也尝试过阅读Spring源码,了解过Spring的启动流程,但不知道大家有没有和我一样心里总是感觉很“虚”,面试遇到了也是结结巴巴的回答。所以这次准备写一系列文章,手写一个简易的Spring,重新捋一遍IOC容器初始化、DI依赖注入、AOP以及Spring MVC启动流程,让我们不再“虚”。效果预览先来看下整体的项目架构,总共31个相关类,类和包的命名尽量贴合原生的Spr

2021-03-11 17:37:10 319

原创 【MySQL】InnoDB

结构图内存Buffer Pool 数据缓冲对于数据的操作,不是每次都直接操作磁盘,因为磁盘的速度太慢了。 InnoDB使用了一种缓冲池的技术,也就是把磁盘读到的页放到一块内存区域里面。这个内存区域就叫Buffer PoolInnoDB操作数据有一个最小的逻辑单位,叫做页(索引页和数据页,占16KB),Buffer Pool缓存的是就是他们。读取页先判断是不是在缓冲池里面,如果是,就直接读取,不用再次访问磁盘。修改数据先修改缓冲池里面的页。InnoDB里面有专门的后台线程把Buffer Po

2021-01-31 19:08:53 99

原创 MySQL

概述结构图server层server层由连接器、分析器、查询缓存、优化器、执行器组成;连接器:负责与客户端建立连接,获取权限,维持和管理连接;分析器:进行词法分析和语法分析;词法分析(把输入的“select”关键词识别出来,这是一个查询语句。把表明 字符串T、列明ID 字符串等识别出来) 语法分析(根据语法规则,判断输入的sql是否满足MySQL语法)查询缓存:如要要查询的数据在缓存在缓存中,则直接返回不走后面的逻辑;对一个表进行更新,则这个表上所有的查询缓存都会被情况,此对于更新压力大的数据

2021-01-31 18:03:23 135

转载 【GIT】rebase 还是 merge的使用场景最通俗的解释

什么是 rebase?git rebase 你其实可以把它理解成是“重新设置基线”,将你的当前分支重新设置开始点。这个时候才能知道你当前分支于你需要比较的分支之间的差异。原理很简单:rebase需要基于一个分支来设置你当前的分支的基线,这基线就是当前分支的开始时间轴向后移动到最新的跟踪分支的最后面,这样你的当前分支就是最新的跟踪分支。这里的操作是基于文件事务处理的,所以你不用怕中间失败会影响文件的一致性。在中间的过程中你可以随时取消rebase 事务。官方解释: https://git-scm.com

2021-01-09 21:35:26 230

转载 【数据结构】PriorityQueue的用法和底层实现原理

先讲使用,再讲原理队列是遵循先进先出(First-In-First-Out)模式的,但有时需要在队列中基于优先级处理对象。举两个例子:作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以添加一个新的作业到作业的优先队列中。每日交易时段生成股票报告的应用程序中,需要处理大量数据并且花费很多处理时间。客户向这个应用程序发送请求时,实际上就进入了队列。我们需要首先处理优先客户再处理普通用户。在这种情况下,Java的PriorityQueue(优先队

2020-12-30 16:43:08 504

转载 Java 比较器Comparable和Comparator的使用和区别

1、Comparable和Comparator介绍 在java中Intege,Double等基本数据类型和Sting都实现了Comparable接口,不用我们在自己去实现。对于类的比较,需要我们定义比较用到的字段比较逻辑。Comparable是内部比较器需要在类内部实现,Comparator是外部比较器生成比较器对象。2、使用(1)类实现Comparable接口重写comparato方法和传的参数进行对比public class Persion implements Comparable&lt

2020-12-30 15:35:23 106

原创 【算法】深度遍历+剪枝-矩阵问题

题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第

2020-12-25 20:17:10 267

转载 【数据结构】双队列Deque与LinkedBlockingDeque深入分析

一、双向队列Deque Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。下图描述的是Deque的完整体系图。需要说明的是LinkedList也已经加入了Deque的一部分(LinkedList是从jdk1.2 开始就存在数据结构)。   D...

2020-12-24 18:52:40 292 1

原创 【数据结构】双队列-DEQUE

Deque是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。线性集合,支持两端插入和移除元素。大多数Deque实现对它们可能包含的元素数量没有固定限制。此接口定义了访问双端队列两端元素的方法。 提供了插入,移除和检查元素的方法。一种在操作失败时抛出异常,另一种返回特殊值( null或false ,具体取决于操作) 操作第一个元素 操作最后一个元素抛出异常特殊值抛出异

2020-12-24 18:35:00 322 1

原创 【数据结构】队列

队列细节记录public interface Queue<E> extends Collection<E> { /** * 在容量限制满足的情况下成功添加 返回 true * 如果当前没有可用空间 抛出illeglastateException异常 */ boolean add(E e); /** * 在容量限制满足的情况下成功添加 返回 true * 如果当前没有可用空间 返回 false

2020-12-23 15:46:10 95

原创 【算法】二叉树遍历-二叉树锯齿层序遍历

题目给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回锯齿形层序遍历如下:[[3],[20,9],[15,7]]解题思路:1.将二叉树按层级写入list2.偶数层倒排序BFS(广度优先)public List<List<Integer>> zigzagLevelOrder(

2020-12-22 17:38:52 200 1

转载 【算法】动态规划-爬楼梯问题

【算法】动态规划-爬楼梯问题题目数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i] (索引从0开始)。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。示例 1:输入: cost = [10, 15, 20]输出: 15解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。示例 2:输入: cos

2020-12-22 15:51:50 705

空空如也

空空如也

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

TA关注的人

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