SpringBoot-SpringMVC在SpringBoot项目中组件启动流程
参考文献
SpringMVC执行流程
DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心.用户发出请求,DispatcherServlet接收请求并拦截请求.
HandlerMapping为处理器映射.DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler
HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器
HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等
HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler
Handler让具体的Controller执行
Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView
HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传 ...
SpringBoot-一个请求的处理全过程(未完待后续补充完整)
参考文献
请求流程
Tomcat线程接受到请求,经过一系列调用后,调用到ApplicationFilterChain的doFilter方法.doFilter方法调用ApplicationFilterChain的internalDoFilter方法,依次执行过滤器链的每个Filter的doFilter.
javax.servlet.http.HttpServlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
3. org.springframework.web.servlet.FrameworkServlet#service
4. javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
5. org.springframework.web.servlet.FrameworkServlet#doXXX
XXX: 表 ...
JDK8特性-default方法
参考文献
Java8实战
解决问题的三条规则
如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断.
类中的方法优先级最高.类或父类中声明的方法的优先级高于任何声明为默认方法的优先级.
如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体.
1234567891011121314151617181920package com.holelin.sundry.test.common;public interface A { default void hello() { System.out.println("Hello from A"); }}interface B extends A { default void hello() { System.out.println("Hello from B&qu ...
SpringBoot-注解@EnableAutoConfiguration自动装配原理
参考文献
SpringBoot 自动配置启动流程 为什么没有执行selectImports方法
@EnableAutoConfiguration注解
123456789101112131415161718192021222324252627282930@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage// 入口@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration { /** * Environment property that can be used to override when auto-configuration is * enabled. */ String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautocon ...
Java并发源码分析-ConcurrentHashMap源码分析
参考文献
面试 ConcurrentHashMap ,看这一篇就够了!
ConcurrentHashMap
JDK1.7
在 JDK1.7 中,ConcurrentHashMap 使用了分段锁的机制,将哈希表分为多个 Segment,每个 Segment 上都有一把锁,不同的 Segment 可以被不同的线程同时访问,这样可以提高并发度,减少锁的争用。
每个 Segment 内部使用一个 HashEntry 数组来存储元素,每个 HashEntry 都是一个链表的头节点,通过链表的方式解决哈希冲突。这种数据结构的设计使得并发情况下,只有访问同一个 Segment 上的元素才需要加锁,其他 Segment 上的元素可以并发访问,提高了并发度。
JDK1.8之后
在 JDK1.8 中,ConcurrentHashMap 放弃了 Segment 分段锁的机制,采用了与HashMap相同的Node 数组+链表+红黑树的结构。这样可以减少了锁的竞争,提高了并发度,同时也减少了内存占用。
在 JDK1.8 中,ConcurrentHashMap 使用了CAS +synchroniz ...
Java并发编程-原子操作类概览
参考文献
原子操作类
由于变量类型的关系,在J.U.C中提供了12个原子操作的类.这12个类可以分为四大类:
基本类型:
AtomicBoolean: 原子更新布尔类型
AtomicInteger: 原子更新整型
AtomicLong: 原子更新长整型
数组类型:
AtomicIntegerArray: 原子更新整型数组里的元素
AtomicLongArray: 原子更新长整型数组里的元素
AtomicReferenceArray: 原子更新引用类型数组里的元素
引用类型:
AtomicReference: 原子更新引用类型
AtomicReferenceFieldUpdater: 原子更新引用类型里的字段
AtomicMarkableReference: 原子更新带有标记位的引用类型,可以原子更新一个布尔类型的标记位和引用类型.
字段更新:
AtomicIntegerFieldUpdater: 原子更新整型的字段的更新器
AtomicLongFieldUpdater: 原子更新长整型字段的更新器
AotmicStampedReference: 原子 ...
Java基础-SPI机制
参考文献
Java SPI 机制详解
SPI机制
JDK SPI(Service Provider Interface)机制是一种基于接口的服务发现机制,它允许应用程序在运行时动态地查找和加载实现某个接口的服务提供者.
在每次类加载的时候会先去找到 class 相对目录下的 META-INF 文件夹下的 services 文件夹下的文件,将这个文件夹下面的所有文件先加载到内存中,然后根据这些文件的文件名和里面的文件内容找到相应接口的具体实现类,找到实现类后就可以通过反射去生成对应的对象,保存在一个 list 列表里面,所以可以通过迭代或者遍历的方式拿到对应的实例对象,生成不同的实现.
JDK SPI 机制的基本原理如下:
定义接口: 定义一个接口,其实现类将作为服务提供者.
配置文件: 在 META-INF/services目录下创建一个以接口全限定名命名的文本文件,该文件的内容是实现该接口的服务提供者的全限定名.
文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有多个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载.
服务加 ...
I/O模型
参考文献
6.2 I/O Models
小林coding-什么是零拷贝?
Netty-零拷贝
Netty零拷贝机制
Zero Copy I: User-Mode Perspective
I/O读写的基本原理
为了避免用户进程直接操作内核,保证内核安全,操作系统将内存(虚拟内存)划分为两个部分:
内核空间(Kernel-Space)
用户空间(User-Space)
针对Linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间
I/O 请求可以分为两个阶段,分别为调用阶段和执行阶段.
第一个阶段为I/O 调用阶段,即用户进程向内核发起系统调用.
第二个阶段为I/O 执行阶段.此时,内核等待 I/O 请求处理完成返回.
该阶段分为两个过程:首先等待数据就绪,并写入内核缓冲区;
随后将内核缓冲区数据拷贝至用户态缓冲区.
在Linux系统中,内核模块运行在内核空间,对应的进程处于内核态;用户 ...
生活日常-上海日常信息
参考文献
各种价费标准一目了然!2023年版上海市市民价格信息指南公布→
上海地铁
2023年版上海市市民价格信息指南摘要
上海地铁线路图
注: 图片来源于上海地铁,仅供自己参考,若有侵权,请联系删除.
11号线运行时刻表
注: 图片来源于上海地铁,仅供自己参考,若有侵权,请联系删除.
公交车发车时间表
18路公交发车时间表(数据更新时间20230423)
15路公交发车时间表(数据更新时间20230423)
15路区间公交发车时间表(数据更新时间20230423)
生活日常-骑行
参考文献
https://www.sheldonbrown.com/chinese/tire-sizing.html
限位螺丝
H限位螺丝
H螺丝是调整后拨导轮相对于飞轮最小齿的限位螺丝,通常在螺丝附近会标注“H”的英文字母,代表高速“High”的意思.
逆时针转动螺丝,导轮会越靠近外侧;
顺时针转动螺丝,则导轮会靠近内侧.
导轮的位置调整到与最小齿轮最外侧相互垂直为佳,可防止链条因为变速幅度过大掉入车架与飞轮之间的间隙中.
L限位螺丝
L螺丝是调整后拨导轮相对于飞轮最大齿的限位螺丝,通常在螺丝附近会标注“L”的英文字母,代表低速“LOW”的意思.
逆时针转动螺丝,导轮会越靠近外侧;
顺时针转动螺丝,则导轮会靠近内侧.
导轮的位置调整到与最大齿轮相互垂直为佳,可防止链条因为变速幅度过大掉入辐条与飞轮之间的间隙中.
导轮与飞轮距离螺丝
该螺丝是调整后拨导轮相间于飞轮间距的限位螺丝,通常独立一颗靠近后拨勾,因为变速时后拨张力的大小会影响变速的速度,理论上来说后拨导轮越靠近飞轮是最好的,但是靠得太近导轮与飞轮的变速齿会相互碰撞发出“咔咔”的响声.
调整的间隙是导轮与 ...