![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
源码系列
夜勿语
热爱技术,分享技术,博客园地址:https://www.cnblogs.com/yewy/
展开
-
一文搞懂AQS及其组件的核心原理
前言JDK1.5以前只有synchronized同步锁,并且效率非常低,因此大神Doug Lea自己基于Java写了一套并发框架,这套框架的核心就在于AbstractQueuedSynchronizer类(即AQS),性能非常高,所以被引入JDK包中,即JUC。那么AQS是如何做到高性能的呢?本篇就是对AQS及其相关组件进行分析,了解其原理,并领略大神的优美而又精简的代码。AbstractQueuedSynchronizerAQS是JUC下最核心的类,没有之一,其它的Lock以及并发控制类都是基于这个原创 2020-10-06 16:45:20 · 3050 阅读 · 7 评论 -
你所不知道的Spring的@Autowired实现细节
前言相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Spring中是如何实现的呢?这就要分析Spring源码才能知道了。友情提示:本篇主要是讲解Autowired的实现原理,不会分析Spring初始化的过程,不熟悉的读者可以先阅读笔者之前的一篇文章《这一次搞懂Spring的Bean实例化原理》。正文在Spring Bean的整个创建过程中会调用很多BeanPostProcessor接口的的实现类:上图是我整理的Sp原创 2020-08-22 11:36:25 · 2865 阅读 · 2 评论 -
Mybatis插件扩展以及与Spring整合原理
文章目录前言正文插件扩展1. Interceptor核心实现原理2. Mybatis的拦截增强Mybatis与Spring整合原理1. SqlSessionFactory的创建2. 扫描Mapper并创建代理对象3. 如何整合Spring事务4. FactoryBean的扩展知识总结前言前面几篇文章分析了Mybatis的核心原理,但模块较多,没有一一分析,更多的需要读者自己下来研究。不过Mybatis的插件扩展机制还是非常重要的,像PageHelper就是一个扩展插件,熟悉其扩展原理,才能更好的针对我们原创 2020-07-09 23:08:31 · 922 阅读 · 0 评论 -
深入Mybatis源码——执行流程
前言上一篇分析Mybatis是如何加载解析XML文件的,本篇紧接上文,分析Mybatis的剩余两个阶段:代理封装和SQL执行。正文代理封装Mybatis有两种方式调用Mapper接口:private static SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);// 第一种try (SqlSession session = sqlMapper.openSession(TransactionI原创 2020-07-07 22:44:57 · 1809 阅读 · 2 评论 -
深入Mybatis源码——配置解析
文章目录前言正文配置解析1. cacheRefElement/cacheElement2. resultMapElements3. sqlElement4. buildStatementFromContext总结前言上一篇分析了Mybatis的基础组件,Mybatis的运行调用就是建立在这些基础组件之上的,那它的执行原理又是怎样的呢?在往下之前不妨先思考下如果是你会怎么实现。正文熟悉Mybatis的都知道,在使用Mybatis时需要配置一个mybatis-config.xml文件,另外还需要定义Ma原创 2020-07-06 22:36:20 · 666 阅读 · 1 评论 -
Mybatis源码初探——优雅精良的骨架
前言Mybatis是一款半自动的ORM框架,是目前国内Java web开发的主流ORM框架,因此作为一名开发者非常有必要掌握其实现原理,才能更好的解决我们开发中遇到的问题;同时,Mybatis的架构和源码也是很优雅的,使用了大量的设计模式实现解耦以及高扩展性,所以对其设计思想,我们也非常有必要好好理解掌握。(PS:本文基于3.5.0版本分析)精良的Mybatis骨架宏观设计Mybatsi的源码相较于Spring源码无论是架构还是实现都简单了很多,它所有的代码都在一个工程里面,在这个工程下分了很多包,原创 2020-07-06 15:23:15 · 795 阅读 · 4 评论 -
全网最深分析SpringBoot MVC自动配置失效的原因
前言本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到的MVC自动失效的问题,虽然网上有很多文章以及官方文档都说明了原因,但还是想亲自看一看,本以为很简单的事情,没想到却引发出一个较复杂的问题,请教了很多人都没有得到结果,网上文章也没有写清楚的,最后还是自己搞了很久才弄明白的,此篇主要记录自己的一个分析过程,。正文引出问题上面是SpringBoot MVC的自动配置,问题是这样的,当我们需要自己配置MVC时,有三种选择:实现WebMvcConfigure原创 2020-06-29 21:58:12 · 1500 阅读 · 0 评论 -
这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)
文章目录前言正文启动原理事件驱动自动配置原理Condition注解原理总结前言SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本大大增加,需要先了解熟悉Spring原理。如果还不清楚Spring原理的,可以先查看博主之前的文章,本篇主要分析SpringBoot的启动、自动配置、Condition、事件驱动原理。正文启动原理SpringBoot启动非常简单,因其内置了Tomcat,所以只需要通过下面几种方式启动即可原创 2020-06-26 13:14:34 · 1588 阅读 · 2 评论 -
这一次搞懂Spring Web零xml配置原理以及父子容器关系
前言在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的。基于约定大于配置的规定,Spring提供了很多注解帮助我们简化了大量的xml配置;但是在使用SpringMVC时,我们还会使用到WEB-INF/web.xml,但实际上我们是完全可以使用Java类来取代xml配置的,这也是后来SpringBoott的实现原理。本篇就来看看Spring是如何实现完全的零XML配置。正文先来看一下原始的web.xml配置:<原创 2020-06-20 13:11:29 · 824 阅读 · 0 评论 -
这一次搞懂SpringMVC原理
文章目录前言正文请求入口组件初始化调用Controller参数、返回值解析总结前言前面几篇文章,学习了Spring IOC、Bean实例化过程、AOP、事务的源码和设计思想,了解了Spring的整体运行流程,但如果是web开发,那么必不可少的还有Spring MVC,本篇主要分析在请求调用过程中SpringMVC的实现原理,通过本篇要搞懂它是怎么解决请求、参数、返回值映射等问题的。正文请求入口我们都知道前端调用后端接口时,都会通过Servlet进行转发,而Servlet的声明周期包含下面四个阶段:原创 2020-06-15 23:43:32 · 1300 阅读 · 0 评论 -
这一次搞懂Spring事务是如何传播的
文章目录前言正文事务切面的调用过程事务的传播性概念实例分析总结前言上一篇分析了事务注解的解析过程,本质上是将事务封装为切面加入到AOP的执行链中,因此会调用到MethodInceptor的实现类的invoke方法,而事务切面的Interceptor就是TransactionInterceptor,所以本篇直接从该类开始。正文事务切面的调用过程 public Object invoke(MethodInvocation invocation) throws Throwable { // Work原创 2020-06-12 00:00:09 · 1034 阅读 · 0 评论 -
这一次搞懂Spring事务注解的解析
前言事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发,解耦业务逻辑和系统逻辑。但是Spring事务原理是怎样?事务在方法间是如何传播的?为什么有时候事务会失效?接下来几篇文章将重点分析Spring事务源码,让我们彻底搞懂Spring事务的原理。正文XML标签的解析<tx:annotation-driven transaction-manager="transactionManager"/>配置过事务的应该都不陌生,上面这个配原创 2020-06-09 22:14:13 · 1243 阅读 · 0 评论 -
这一次搞懂Spring代理创建及AOP链式调用过程
文章目录前言正文基本概念代理对象的创建小结AOP链式调用前言AOP,也就是面向切面编程,它可以将公共的代码抽离出来,动态的织入到目标类、目标方法中,大大提高我们编程的效率,也使程序变得更加优雅。如事务、操作日志等都可以使用AOP实现。这种织入可以是在运行期动态生成代理对象实现,也可以在编译期、类加载时期静态织入到代码中。而Spring正是通过第一种方法实现,且在代理类的生成上也有两种方式:JDK Proxy和CGLIB,默认当类实现了接口时使用前者,否则使用后者;另外Spring AOP只能实现对方法的原创 2020-06-06 18:23:58 · 1476 阅读 · 0 评论 -
Spring IOC原理补充(循环依赖、Bean作用域等)
文章目录前言正文循环依赖什么是循环依赖?Spring是如何解决循环依赖的?作用域实现原理以及如何自定义作用域作用域实现原理自定义ScopeBeanPostProcessor的执行时机SpringBoot零配置实现原理浅析总结前言通过之前的几篇文章将Spring基于XML配置的IOC原理分析完成,但其中还有一些比较重要的细节没有分析总结,比如循环依赖的解决、作用域的实现原理、BeanPostProcessor的执行时机以及SpringBoot零配置实现原理(@ComponentScan、@Import、@原创 2020-06-02 23:39:57 · 1109 阅读 · 0 评论 -
这一次搞懂Spring的Bean实例化原理
文章目录前言正文环境准备两个重要的Processor注册BeanPostProcessor对象Bean对象的创建createBeanInstanceaddSingletonFactorypopulateBeaninitializeBean总结前言前两篇文章分析了Spring XML和注解的解析原理,并将其封装为BeanDefinition对象存放到IOC容器中,而这些只是refresh方法中的其中一个步骤——obtainFreshBeanFactory,接下来就将围绕着这些BeanDefinition对原创 2020-05-31 20:52:40 · 3305 阅读 · 2 评论 -
这一次搞懂Spring自定义标签以及注解解析原理
前言在上一篇文章中分析了Spring是如何解析默认标签的,并封装为BeanDefinition注册到缓存中,这一篇就来看看对于像context这种自定义标签是如何解析的。同时我们常用的注解如:@Service、@Component、@Controller标注的类也是需要在xml中配置<context:component-scan>才能自动注入到IOC容器中,所以本篇也会重点分析注解解析原理。正文自定义标签解析原理在上一篇分析默认标签解析时看到过这个类DefaultBeanDefiniti原创 2020-05-26 22:50:20 · 894 阅读 · 1 评论 -
这一次搞懂Spring的XML解析原理
前言Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率。同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规范,但因其体系庞大、设计复杂对于刚开始阅读源码的人来说是非常困难的。所以在此之前首先你得下定决心,不管有多困难都得坚持下去;其次,最好先把设计模式掌握熟练;然后在开始阅读源码时一定要多画UML类图和时序图,多问自己为什么要这么设计?这样设计的好处是什么?还有没有更好的设计?当然,晕车是难免的,但还是那句话,一定原创 2020-05-24 16:39:26 · 1878 阅读 · 5 评论 -
Zookeeper——分布式一致性协议及Zookeeper Leader选举原理
一、引言随着业务的增长,单体架构发展为分布式架构,大大提升了业务的处理能力,但同时也带来了很多单体架构不存在的问题,如:各节点之间网络通信的异常。由于网络异常造成的网络分区。引出“三态”。在单体架构中只会存在“成功”或“失败”两种结果,但是在分布式架构中由于网络异常将会出现“未知”的结果,即请求丢失或者响应丢失,导致客户端超时。各节点会发生故障。分布式事务以及数据一致性。各节点的配...原创 2019-08-17 21:54:26 · 1080 阅读 · 0 评论 -
Dubbo——SPI及自适应扩展原理
文章目录引言正文一、什么是SPI?1. Java SPI的实现2. Dubbo SPI实现原理由配置文件得到的猜想SPI源码二、自适应扩展机制三、Dubbo IOC引言Dubbo虽然已交由apache管理,并且社区活跃度也不如SpringCloud,但也是国内应用比较广泛的RPC框架,其背后的设计思想非常值得我们学习借鉴。鉴于Dubbo官方文档对于基础的使用配置已经讲解的非常清楚了,这里就不再...原创 2019-08-27 18:42:11 · 1860 阅读 · 2 评论 -
Dubbo——服务发布原理
引言在使用Dubbo的时候你一定会好奇它是怎么实现RPC的,而要了解它的调用过程,必然需要先了解其服务发布/订阅的过程,本篇将详细讨论Dubbo的发布过程。源码分析新学Dubbo大都会比较疑惑,服务启动时的入口在哪?是如何加载我们的配置的?由于Dubbo是基于Spring的自定义扩展标签来实现配置的,而发布服务时我们需要配置dubbo:service标签,因此我们可以从这里入手。首先我们需...原创 2019-08-31 18:57:00 · 1542 阅读 · 0 评论 -
Dubbo——服务引用
引言上一篇我们分析了服务发布的原理,可以看到最终默认是创建了一个Netty server,这一篇原创 2019-09-03 14:42:22 · 1241 阅读 · 0 评论 -
Dubbo——服务调用过程
文章目录引言服务的交互服务降级集群容错服务调用服务端接收请求总结引言经过之前文章的铺垫,现在可以来分析服务的交互调用过程了。服务的交互服务降级从名字上看我们不难理解MockClusterInvoker相当于是对普通Invoker(如DubboInvoker)的装饰增强,提供集群容错相关的功能,因此最终还是会进入到DubboInvoker,所以这里就以MockClusterInvoker....原创 2019-09-07 21:42:47 · 754 阅读 · 0 评论 -
Dubbo——服务目录
引言前面几篇文章分析了Dubbo的核心工作原理,本篇将对之前涉及到但却未细讲的服务目录进行深入分析,在开始之前先结合前面的文章思考下什么是服务目录?它的作用是什么?正文概念及作用清楚Dubbo的调用过程就知道Dubbo在客户端和服务端都会为服务生成一个Invoker执行体,这个Invoker包含了所有的配置信息,也相当于是一个代理对象,所以这也就引发出几个问题:怎么管理Invoker?...原创 2019-09-10 08:11:20 · 1318 阅读 · 0 评论 -
Zookeeper——Watcher原理详解
文章目录引言正文一、如何注册监听二、如何触发监听事件三、事件类型有哪些四、Watcher可以被无限次触发么?为什么要这么设计?五、Watcher实现原理1. 客服端发送请求a. 初始化客户端并绑定Watcherb. exists/getData/getChildren绑定Watcher以及发送请求ClientCnxn.submitRequestClientCnxnSocketNIO.doTranp...原创 2019-08-24 17:13:10 · 1977 阅读 · 1 评论