自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 问答 (2)
  • 收藏
  • 关注

原创 springmvc详解(3)请求分发流程之拦截器 HandlerInterceptor

前言当Servlet接收到请求后会最终调用doDispatch方法后会去找到对应的HandlerMapping,同时也会找到配置的拦截器,最终组成需要的HandlerExecutionChain执行链(这里省略部分代码保留主要功能):protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { // 1.确定使用的handler Handler

2020-11-07 16:05:42 305

原创 SpringMVC详解-请求分发流程之处理器 HandlerMapping

上篇文章《SpringMVC详解-怎么接收请求》已经提到过了,当Servlet接收到请求后会最终调用doDispatch方法(这里省略部分代码保留主要功能):protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { // 1.确定使用的handler mappedHandler = getHandler(processedRe

2020-10-28 16:37:17 464

原创 SpringMVC详解(1)-怎么接收请求

在学习springmvc怎么接收请求前,我们需要先讲一讲servlet。它其实java提供的一个Web组件。而我们比较熟知的Tomcat容器就是一种Servlet容器的实现,顾名思义就是用来管理servlet的。最早学习java的时候我相信每个人都学习过Servlet的知识,我们只需要继承一个HttpServlet,然后在WEB-INF目录下的web.xml文件中配置Servlet的访问对外路径,最后启动Tomcat服务器。我们就可以在浏览器中访问该Servlet了。不过在springboot中提供了更

2020-10-21 17:32:34 603 1

原创 GC怎么判断对象死亡和几种回收算法

1 GC垃圾回收的原理其实垃圾回收的原理很简单:就是判断出死亡的对象,然后清除死亡的,留下存活的即可。那么怎么判断对象已经死亡呢?常有的有以下两种:1)引用计数法(Reference Counting):在对象中添加一个引用计数器,每当一个地方引用它时,计数器就加1;当引用失效时,计数器就减1;当引用计数为0时就会被回收。但是它存在一个很大的问题就是循环引用:如下图,当实例化A时,A会持有实例B,B会持有C,C持有A。这样一来我们就会发现:如果需要回收A,除了释放初始实例化引用,还需要释放C的

2020-09-24 22:37:44 292

原创 程序员需要知道ThreadLocal的这几个点

1 什么是ThreadLocalThreadLocal是什么呢?在实际开发中经常被用来绑定用户信息、日志号。数据库连接等等。这样一来,我们编码时就不用通过传递参数方式而影响业务逻辑。就如名字一般,我们可以简单的认为它的作用就是把数据绑定到当前线程上,然后用于后续的操作。既然是将数据绑定到当前线程上,那最方便高效的数据存储方式就是key-value的hash方式存储了。不过不同于HashMap的实现方式,它单独提供了一个叫做ThreadLocalMap的Map类,与HashMap有着类似的功能,但是区别

2020-09-22 21:26:56 193

原创 AQS-用写公司简章方式理解读写锁(ReentrantReadWriteLock)

读写锁,顾名思义。这是一种对于两种不同行为的同步器工具,而读写是两种互斥的行为(写的时候,不能读。读的时候不能写),因此ReentrantReadWriteLock锁也具有此特性。1  用写公司简章过程理解读写锁想象一下,你正在写一份公司内部管理的简章,而笔只有一支(写锁),所以只有当你拿到这只笔(获取写锁)后才可以写内容。写完后(释放锁),简章就可以张贴出去让同事去阅读了(同时阅读:读锁)。但是这个时候你发现简章上写的有些问题,需要重新修改一下。不过你需要等你这些同事看完全部离开之后(释放读

2020-09-08 16:49:15 150

原创 AQS-用配钥匙和保险箱理解可重入锁(ReentrantLock)

今天我们来学习可重入排他锁,它同样是JUC包下使用AQS同步框架来实现的,因此代码比较简洁,只要了解了AQS的原理那么就会觉得it is so easy。1 怎么理解可重入锁排他,说明锁只能被一人占有(就类似信号量(semaphore)为1,每一时刻只能有一人拥有)。可重入,同一个人可以多次使用同一资源,这非常合理。试想一下,当一只保险箱的钥匙归你所属后,难道你不能再去锁匠那再配一把来开箱子吗?在这个法制社会里,钥匙是你的,那你去配钥匙肯定是合法的,至于你为什么要配钥匙呢?一家人嘛,不过我相信你不可能把

2020-09-02 22:21:39 168

原创 AQS-用购票的方式理解信号量(Semaphore)

在有些情况下,由于资源的限制,程序无法支持无限量的线程并发,因此引入信号量(Semaphore),只有获取信号量凭证的线程才允许执行。1用购票理解信号量(Semaphore)就好比我们乘坐火车一样,座位数量(信号量大小)是一定的。只有买到车票(获取信号量)的人才允许上车,当车票售完了,没有车票的人(没有获取信号量)是不允许上车的。只有等到有人下车,或者退票(释放持有信号量)后,等待的人才可以购票(获取信号量)上车:其实现方式也非常简单,是基于java提供的AQS同步器框架实现的,因此只要理解了AQS

2020-08-31 17:20:57 191

原创 用火车购票的方式打开 AQS同步器(二)

1 引言上篇文章讲述了java AQS结构以及其中排他API的 实现逻辑。而这一篇我们来看看其共享逻辑, 这里依旧使用上文的火车买票为例,便于理解。这里直接会从代码实现讲起,对于还不了解AQS的结构的建议先看一下上一篇文章:用火车购票的方式打开 AQS同步器(一)2 AQS共享和排他逻辑的区别共享实现方式与排他逻辑非常类似(毕竟是框架嘛)。排他逻辑其实可以看作是共享逻辑的一种特例,由于它的独占特性。排他逻辑tryAcquire方法返回值为真假,表示是否资源(一票一车的情况)已经被其他人占用。而共享逻辑

2020-08-28 11:51:37 114

原创 用火车购票的方式打开 AQS同步器(一)

引言AQS(AbstractQueuedSynchronizer,下文直接使用AQS的简称)是java JUC包下提供的,基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架,使用者可以继承它来实现阻塞锁或者其他功能。由于是一个框架,所以其概念会比较抽象,因此这里会使用乘火车车购票的例子来帮助理解。AQS同步器结构-成员变量AQS的三个重要的成员变量,其功能都是围绕这三个变量实现的。 /** * Head of the wait queue, lazily initializ

2020-08-26 23:44:40 214

原创 用租车的方式打开java线程池,原理太简单了!

线程的创建和销毁是比较费时的,所以我们会通过使用线程池来复用线程,降低资源消耗,提高响应。同时使用线程池可以避免无限制的创建线程,防止耗尽计算机资源。(以下用租车为例,来模拟线程)1.租车公司讲线程池a. 如果你去一个远的地方,你就会需要一辆车。造一辆车耗费的资源可想而知,而到达目的地后,这辆车 对你又没有用了。 线程就像这辆车一样,不过它z在使用后,本着不浪费的原则系统就会销毁线程回收这一部分资源。b. 而现实中我们也可以选择租车出行,出租车是属于出租车公司的,就如同线程池的线程。-

2020-08-25 10:59:11 115

原创 一文搞懂LinkedList

01 原理LinkedList底层采用双向链表实现。与ArrayList不同,链表不需要扩容,除此之外还会有以下特点。02 特点非连续的内存,因此不支持随机访问,只能通过节点持有的指针,依次向后(向前)查找就安排,查找的复杂度高。2. 插入操作性能好。只需要插入位置的前后节点的引用指向该节点即可。3.  删除性能好,与插入类似,将删除节点前后节点的引用互相指向即可。03 源码最后从源码里具体分析一下,LinkedList中的添加(add),查找(get),删除(.

2020-07-18 12:21:07 130

原创 一文讲清ArrayList的原理

01原理ArrayList底层采用数组实现,具有也具有数组的优缺点,同时支持动态扩容(扩展为原来的1.5倍)。所以它非常适合需要使用索引快速访问的场景。同时由于其自动扩容的功能,我们需要注意在初始化集合时需要指定大小。##02特点具有连续的内存空间,支持随机访问:修改操作性能好:插入操作性能差(插入位置不在末尾时,需要内存复制):删除性能差(删除位置不在末尾时,需要内存复制)。在实际应用中为了提 高删除性能,有时候会先标记数据数字删除(会造成内存...

2020-07-13 23:04:17 1430

原创 springboot2.0配置WebMvcConfigurer的configureMessageConverters方法不启用

问题想要自定义一个序列化,将long型转成string,将double类型保留3位小数。但是发现配置后无效。代码@Configurationpublic class BaseMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<Htt...

2019-07-18 09:52:36 13230 2

原创 利用javadoc来生成showdoc文档

说明:每次开发都要写showdoc,有点累觉不爱,写了一个工具类来生成showdoc。由于使用的是springboot开发,该工具只能再spring框架下使用,而利用的javadoc,需要加入javadoc的依赖。代码地址:https://github.com/JavanFeng/showDocUtilreadme如下:...

2019-06-30 20:30:34 2360 1

原创 springboot接收JSON字符串绑定基础类型参数和String类型

原因由于前端框架原因,后端post请求一致用applition/json 请求。对于后端而言实体类需要加上@RequestBody注解,但是有时候修改接口等只需要一两个参数,如果将其分装为实体,费时费力。因此可以自己写一个参数处理器。解决可以自己写一个参数处理器。实现HandlerMethodArgumentResolver接口,再将其配置到WebMvcConfigurer类中的参数处理集合...

2019-06-19 12:49:41 4782

原创 服务端接受连接,读过程

文章目录1. 客户端接收连接:2. 读操作:1. 客户端接收连接:在Netty服务端启动的时候,会先启动一个Reactor线程池,去绑定启动的地址和端口,并且线程池中的channel复用器会循环监听客户端的各种事件。实际会调用NioEventLoop中的run方法,代码如下(只保留具体执行代码): @Override Protected void run(){ for(;;){...

2019-06-16 18:11:58 228

原创 Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) for operation>

mysql 编码异常的问题异常:Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) for operation ‘>’原因:和网上的一些问题原因不同,不是由于数据库的编码问题。而是我的在sql中有一个时间范围的sql条件,当时间格式为yyyy-MM (如‘201...

2019-06-04 12:43:19 1834 1

翻译 [官文翻译]Spring WebFlux Framework基本内容

29.2 The “Spring WebFlux Framework”Spring WebFlux is the new reactive web framework introduced in Spring Framework 5.0. Unlike Spring MVC, it does not在spring5.0中介绍,Spring WebFlux 是一个全新的反应式的web框架。不同于...

2019-05-17 00:52:18 324

原创 spring cloud ribbon负载均衡构建图

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190505133151100.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4OTUxMzcy,size_16,color_FFFFFF,...

2019-05-05 13:33:46 263

原创 ServerBootStrap 启动流程源码

文章目录0 示例代码:1 group方法保存Reactor线程池2 channel 方法指定具体Channel类型3 option 方法设置参数4 handler 和 childHandler方法保存处理器5 pipline中添加处理器6 绑定端口并启动服务器6.1 initAndRegister方法:6.1.0 method0 newChannel()方法6.1.1 method1 init()...

2019-04-30 00:09:03 395

原创 @Configuration和@Component注册的@Bean

文章目录0. 区别1. @Bean的注册原理和过程2. CGLIB内部方法调用:0. 区别 直接讲一下区别: 在配置类的方法间调用时,如果类时@component标注的,每次调用获取的都是新的实体;而如果是@configuration标注的话,每次调用返回的是同一个实体Bean。其他方面都是相同,可以无差别使用(装配注入等)。看一下代码可能更加清晰一点:哪是什么原因造成的呢?不卖...

2019-04-17 00:06:21 1070

原创 ThreadPoolExecutor 之执行与关闭

文章目录1.类结构2. 线程池流程和execute方法2.1 addWorKer()方法2.2 Work 的runWorker方法3. 线程池空闲线程的释放4. 线程池的关闭4.1 shutdown和shutdownNow4.2 共同方法:tryTerminate1.类结构Executor接口。该接口定义执行器执行方法execute。ExecutorService接口。该接口定义管理执行...

2019-04-08 13:28:56 6018

原创 ReentrantLock之lock和unlock方法

文章目录ReentrantLock类结构Sync类结构LOCK方法(非公平锁为例)UNLOCK方法其他方法tryLockReentrantLock类结构该类实现Lock接口。Lock接口定义了锁最基本的方法。该类的final成员变量Sync同步器,以静态内部类的形式提供了公平同步器和非公平同步器。(构造器提供选择是否公平,默认非公平。公平锁性能要劣于非公平锁)Sync类结构Sy...

2019-04-06 22:50:33 1655

原创 @Enablexxx前缀的注解解析原理

@Enablexxx前缀的注解用于开启某个功能,那其原理应该是什么呢?文章目录1.常见@Enable***注解2. @import注解在哪里被解析的,如何解析的?3.番外:1.ConfigurationClassPostProcessor什么时候加入到容器里的?2.enhanceConfigurationClasses方法又做了些什么呢?为什么要增强呢?1.常见@Enable***注解首先我...

2019-03-27 23:27:51 902

原创 @Autowired注解注入实现原理

@Autowired 支持set方法,构造方法,参数的注入。下面我们了解一下它的工作原理。目录:1. 解析@Autowired的类AutowiredAnnotationBeanPostProcessor2. 调用AutowiredAnnotationBeanPostProcessor的方法流程3. AutowiredAnnotationBeanPostProcessor中注入方法的...

2019-03-26 00:16:21 17064 2

原创 FeignClient生成代理过程

目录:生成代理流程1.1 @EnableFeignClients注解1.2 FeignClientsRegistrar类1.3 FeignClientFactoryBean1.1 @EnableFeignClients注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Impor...

2019-03-24 22:31:33 4330 1

原创 代码整洁之道笔记(二)

第四章 注释1. 作者认为注释是失败的,说明代码表达不清楚。同时注释具有欺骗性,因为代码一直在优化迭代,但是注释不一定会被维护。2.如果能用代码来代替注释,那就不要写注释喽;———-分割线,什么是好注释———-3.法律信息:版权许可等4.描述函数返回值,还有一些校验的正则。但还是推荐用代码来解释一切可以解释的哦。5.对意图的解释6.阐述,指对语言中的标准库做一些说明,因...

2019-03-17 07:53:59 80

原创 代码整洁之道 笔记(一)

第一章:命名自己的不足之处主要是 :专有名词了解少,在函数方法里的参数命名比较随意。第二章函数:1,要求:一个函数只做一件事。单一权责。2,不同抽象层的不应该在一个层级(我的理解是,抽象概念—具体步骤—实现细节,这样的分层。)3,switch语句。本身就做多件事,建议放在较低抽象层。可以使用多态实现。这一条建议不绝对要这样做。4,对于函数名要使用描述性的名称。5,...

2019-03-17 07:50:08 139

原创 Feign 传输报请求头太大无法解析的问题

异常: java.lang.IllegalStateException: PWC4662: Request header is too large at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:740) at org.apache.coyote.http11.InternalInpu...

2018-02-28 18:00:42 4022 4

原创 调用feign请求超时 feign.RetryableException: Read timed out executing POST

异常: feign.RetryableException: Read timed out executing POST http://xxx at feign.FeignException.errorExecuting(FeignException.java:67) at feign.SynchronousMethodHandler.executeAndDecode(Sync...

2018-02-28 17:56:56 12413 1

原创 使用Spring cloud Feign在后台服务之间调用传递Multipart无法传递的问题

异常: error”:”Bad Request”,”exception”:”org.springframework.web.multipart.support.MissingServletRequestPartException”,”message”:”Required request part ‘file’ is not present”,”path”:”/excel/import/uploa...

2018-02-28 11:17:47 8794 2

原创 hibernate controller层返回前端json转化失败 org.springframework.http.converter.HttpMessage

错误:2018-02-05 14:22:17.567 WARN 520 --- [nio-7900-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableExcepti

2018-02-05 14:25:13 2269

原创 HashMap源码

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { // 一些参数: private static final long serialVersionUID = 362498820763181265L; // 序列号 /**

2017-11-17 17:57:03 174

原创 初窥javaScrit权威指南,第七章 数组(2)

数组方法:join()方法:var a = [1,2,3,4]; console.log(a.join()); // 1,2,3,4console.log(a.join("")); // 1234console.log(a.join(" ")); // 1 2 3 4var b = new Array(10);console.log(b.join("-")); // ---------re

2017-11-17 17:48:46 190

原创 LinkedList源码

一些参数: transient int size = 0; // 集合大小 /** * Pointer to first node. * Invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */

2017-11-03 18:57:23 191

原创 ArrayList源码

一些参数:private static final long serialVersionUID = 8683452581122892189L; // 序列号 /** * 初始的容量大小,构造函数没有指定大小,用此 */ private static final int DEFAULT_CAPACITY = 10; /** * Shared empty

2017-11-03 18:49:48 172

原创 初窥javaScrit权威指南,第七章 数组(1)

注意: js当中的数组是无类型的,同一个数组可以是不同的类型,索引大小是32位数(2^32 -2)。 同时他是动态的,会自己调整长度大小。继承: Array.prototype.创建数组: var empty = []; var primes = [1,2,3,4]; var misx = [1,1,true,"a"];----------直接量可以是常

2017-11-01 19:47:30 228

原创 Mysql的一些简单优化

概述表的设计要合理化,符合三范式(3FN)添加适当的索引分表技术(水平分割、垂直分割)存储过程(数据库三层结构)mysql配置的优化(最大并法术。缓存大小myini)mysql硬件升级定时清除不需要的数据。定时警醒碎片整理优化一: 表的设计满足三范式: 1. 一范式: 原子性-》表的列不能再分割。 关系型数据库自动那个满足1NF. 2. 二范式:表中的记录是唯一的。就是满足

2017-10-17 19:47:15 350

原创 Mysql的基本使用

创建库create database [if not exsits] bdname [create-specification][default] character set charset_name[defalut] collate collation_name[] 可有可无------------------------------------------|创建mydb库create

2017-10-17 19:41:42 229

空空如也

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

TA关注的人

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