- 博客(12)
- 收藏
- 关注
原创 SpringAop流程分析
在分析流程之前,我们先简单的实现一下AOP。@Component@ComponentScan("com.jxau")public class EnableComponentScan {}定义一个扫描包。然后创建一个类开启AOP的扫描注解@Component@EnableAspectJAutoProxy(exposeProxy = true)public class EnableAop {}定义一个切面。@Component@Aspectpublic class AspectJ
2021-07-27 16:34:42 193
原创 Tomcat整体架构
一、Tomcat顶层架构Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。Service主要包含两个部分:Connector和Container。从上图可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;2、Container用于封装和管理Servlet,以及具体处理Request请求;
2021-07-11 16:54:11 415
原创 SpringBoot的启动流程
前言Spring Boot本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。项目启动流程public static void main(String[] args) { SpringApplication.run(SpringBootMainApplication.class,args);}这是我们最熟悉不过
2021-05-31 14:07:01 415
原创 springmvc源码(三)
前言上一篇跟着源码走完了HandlerMapping的创建过程以及对注解的分析和绑定的过程,这一次来看一下HandlerAdapter的过程。一、initHandlerAdapters和initHandlerMapping一样,我们直接进入到getDefaultStrategies当中。protected <T> List<T> getDefaultStrategies(ApplicationContext context, Class<T> strategyI
2021-03-28 16:15:15 174
原创 springmvc源码(二)
initHandlerMappingsprotected void initStrategies(ApplicationContext context) { // 初始化文件上传解析器 initMultipartResolver(context); // 本地化解析 initLocaleResolver(context); // 主题解析器 initThemeResolver(context); // 处理器映射器 保存Url映射关系 initHandlerMappings
2021-03-25 13:52:58 159
原创 SpringMVC源码(一)
前言在进入springmvc源码之前,我们应该知道的是,Servlet的生命周期。实例化(调用空的构造函数)—初始化(init方法)—调用Service方法(调用doService方法)–销毁(destory方法)初始化方法和销毁方法,指挥调用一次,在我们初始化Servlet的时候调用init方法,销毁容器之前会调用destory方法。所以,我们在进入DispatcherServlet之前,应该可以猜得到,他或者他的父类应该会有这样一个方法。最终我们发现,GenericServlet这个抽象类,找到i
2021-03-23 15:08:15 735 1
原创 MyBatis基本源码流程
前言在进行Mybatis的源码流程之前,我们首先应该知道mybatis的使用方法。<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace=绑定一个对应的Dao/Mapper接口
2021-03-14 14:47:54 152
原创 Spring中的循环依赖解决流程
前言说起Spring中循环依赖的解决办法,相信很多朋友们都或多或少会提到三级缓存的问题,那么三级缓存到底是怎么解决循环依赖的问题和他的过程是怎么样的,我们使用idea的debug方式,通过跟进源码来了解一下。一、什么是三级缓存一级缓存:singletonObjects,存放完全实例化属性赋值完成的Bean,直接可以使用。二级缓存:earlySingletonObjects,存放早期Bean的引用,尚未属性装配的Bean三级缓存:singletonFactories。三级缓存,存放实例化完成的Be
2020-12-29 14:20:45 202
原创 1.8环境下的ConcurrentHashMap
前言HashMap在高并发的环境下,执行put操作会导致HashMap的Entry链表形成环形数据结构,从而导致Entry的next节点始终不为空,因此产生死循环获取EntryHashTable虽然是线程安全的,但是效率低下,当一个线程访问HashTable的同步方法时,其他线程如果也访问HashTable的同步方法,那么会进入阻塞或者轮训状态。在jdk1.6中ConcurrentHashMap使用锁分段技术提高并发访问效率。首先将数据分成一段一段地存储,然后给每一段数据配一个锁,当一个线
2020-12-11 14:42:32 922
原创 1.8下的HashMap部分源码浅析
一、、HashMap概述在JDK1.8之前,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的节点都存储在一个链表里。但是当位于一条链表上的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。我们主要来看一下它常用的几个方法二、put方法public V put(K key, V value) { return putVal
2020-12-08 15:30:06 72
原创 1.7环境下的ConcurrentHashMap源码
一、ConcurrentHashMap构造方法ConcurrentHashMap的结构和HashMap有些许的不同。他用一个叫做Segment来代替数组,具体用HashEntry来存储数据。 public ConcurrentHashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL); }可以看到,这里调用无参的构造方法的话,他会去调用具有三个参数的构造
2020-12-01 16:59:33 107
原创 1.7环境下的HashMap源码
HashMap是大家在经常使用的一个容器,那么他在1.7环境下到底是怎么实现的,我们一起来看一下1、HashMap构造方法public HashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); }public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) thr
2020-11-27 15:48:37 105
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人