![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
源码分析
文章平均质量分 92
小毕超
善于钻研思考,乐于追求新知识,热爱微服务架构,国内软考高级系统架构设计师职称,国际TOGAF鉴定级企业架构设计师,华为云·云享专家,CSDN博客专家。曾获“联想杯”移动互联比赛 江苏省一和国二成绩,第四届全国应用型人才比赛“兄弟连杯”国一成绩。
展开
-
PageHelper 分页逻辑 源码解析
`PageHelper` 是一个用于在 `MyBatis` 中进行分页查询的开源分页插件。它能够方便地帮助开发者处理分页查询的逻辑,简化代码,并提高开发效率。`PageHelper` 支持多种数据库,包括 `MySQL、Oracle、PostgreSQL` 等。原创 2024-01-28 15:50:29 · 634 阅读 · 0 评论 -
Redisson 源码解析 - 分布式锁实现过程
Redisson不仅简化了分布式锁的应用过程还支持 `Fair Lock、MultiLock、RedLock、ReadWriteLock` 等锁的实现,本文分别从 `lock`、`tryLock`、`unlock` 、三个地方进行源码的解析。原创 2024-01-07 17:23:13 · 1316 阅读 · 1 评论 -
源码角度分析Java 循环中删除数据为什么会报异常
源码角度分析Java 循环中删除数据为什么会报异常原创 2023-10-27 09:42:08 · 726 阅读 · 0 评论 -
Spring 源码解析 - FactoryBean 获取 Bean 过程
`FactoryBean`是`Spring`框架提供的一个核心接口之一,用来创建复杂或无法通过默认构造函数创建的对象。这种情况下通过实现`FactoryBean`接口,可以自定义实例化`Bean`的过程,包括`Bean`的对象类型、初始化、销毁等。原创 2023-06-08 17:12:55 · 740 阅读 · 1 评论 -
源码角度分析多线程并发情况下数据异常回滚方案
在需要多个没有前后顺序的数据操作情况下,一般我们可以选择使用并发的形式去操作,以提高处理的速度,但并发情况下,我们使用 @Transactional 还能解决事务回滚问题吗。原创 2023-05-28 20:26:25 · 1386 阅读 · 3 评论 -
SpringTx 源码解析 - @Transactional 声明式事务执行原理
方法获取到事务的属性信息后,如果结果不为空的话进行属性的补充后直接将属性信息返回给了。注解,不存在的话再去检测方法所在类上是否符合,这里主要看下方法层面的。的扫描和匹配过程进行分析,如果对这块不了解的话,建议看下前面的。中也是最终触发执行逻辑的类,其中包含了事务的开启、提交、回滚等。这里遍历了所有的事务解析器,这些解析器怎么来的呢,看到。这里对事物属性进行了缓存,看下缓存中不存在的情况,通过。方法中,最后通过反射获取到类下的方法,由于这里不属于。的子类,该类也是源码分析的关键点,由于其属于。原创 2023-04-13 22:00:00 · 564 阅读 · 0 评论 -
SpringAop 源码解析 (二) - 代理对象的创建以及执行过程
方法,主要做了对切面方法的扫描和匹配过程,并且这里拿到的结果就是所有匹配的切面方法包装类集合,本篇文章继续上篇文章的脚步,分析下后面代理对象的创建过程和执行过程。上面文章分析到这个位置,下面继续,如果存在匹配的切面方法,则先进行标记,反之不存在也进行标记,下次再进来该。的话,则会对当前代理对象进行缓存,目的是在同一个类中自我方法调用的情况下,如果被调用的方法带有。,其实是触发所有的切面增强方法,最后再触发目标方法,看到。最后一个时,就是代表所有的切面方法都触发完了,这里的。原创 2023-04-09 17:38:53 · 762 阅读 · 0 评论 -
SpringAop 源码解析 (一) - Aspect 切面方法的查找匹配过程
则是对注解形式处理的,由于现在基本都使用注解形式,所以这里直接看注解形式的处理,进到。方法中,接着判断如果是单例的话就将结果缓存下来,便于下次使用,最后在将结果返回给。方法确实创建了一个代理对象,并且最后使用的也是代理对象,下面就主要分析下。匹配出适合当前类的增强方法,这两个方法也是本篇的核心,下面挨个来分析下。方法,是一个抽象方法,具体逻辑由子类实现,其作用是用来对每个。方法,不过父类中的方法是对配置文件进行解析处理的,而下面的。匹配的增强方法,如果是空的话,则返回一个固定的空数组,在。原创 2023-04-05 15:36:50 · 1045 阅读 · 0 评论 -
Spring 源码解析 - BeanPostProcessor 扩展接口
实例化之前尝试使用该类型的实例生成一个代理对象,如果方法返回的是一个非空对象, 将会跳过后续。实例化、配置和初始化的每个阶段,因此实现过程需要非常谨慎。从上面的触发点源码中,可以看出有些地方是触发的特定类型的。方法,那现在也是从这里入手,主要逻辑在该方法下触发的。的特征,在此之外又提供了获取早期实例的方法。的初始化方法前后,允许我们自定义修改新的。从上面的实例中可以感觉出来,我们并没有对。源码分析的文章中,分析的入口都是基于。的实例化,因此使用的话需要非常谨慎。的实例化息息相关,因此可以从。原创 2023-03-31 20:00:00 · 521 阅读 · 1 评论 -
SpringMVC 源码解析 - Controller 的扫描注册及匹配过程
源码梳理的文章中就分析过,但那次分析的确实不怎么详细,因此这里再继续梳理下,看是如何和上面注册的过程形成呼应的。对应一个接口,如果这里匹配出多个并且一致的话,则会抛出异常,否则最后返回匹配出来的。,其作用是在容器启动后将系统中所有控制器方法的请求条件和控制器方法的对应关系注册到。路径,接着尝试获取映射存储器的读锁,主要防止有写的情况造成线程安全问题,拿到锁后通过。会根据请求条件和容器中存储的系统接口信息比对,再执行对应的控制器方法,从而帮助。,我们要通过反射执行方法的话,是需要目标对象的,因此在。原创 2023-04-01 19:40:46 · 1509 阅读 · 0 评论 -
Spring 源码解析 - @Async 注解下的循环依赖问题原理
仅允许有一个实例,先创建的要被后创建的覆盖,但这个覆盖的前提是实例已经完全创建成功,这里可以看下。方法获取一个早期的实例,获取之后存入二级缓存中,从前面放入三级缓存可以看出其实是触发的。,由于这里是循环依赖,已经放入了第三级缓存中,因此可以命中,这快的源码逻辑在。实例,由于前面已经曝光到了二级缓存中,因此这里可以获取到,但容器中的。存在循环依赖,仅放入二级缓存中,并没有实例化完成,因此这里会返回。真正的实例,而这里返回的是代理实例,现在相当于单例的。是不是很奇怪,难道代理对象就会有问题吗,如果换成。原创 2023-04-01 12:20:26 · 1360 阅读 · 0 评论 -
SpringMVC 源码解析 - 请求执行的过程
SpringMVC 是一个基于 Spring 框架的 MVC 框架,它简化了 Web 应用程序的开发。采用了前端控制器模式,请求会首先被一个中央控制器 DispatcherServlet 处理,再由其分发到具体的 Controller 进行处理。原创 2023-03-25 21:34:51 · 492 阅读 · 0 评论 -
Spring 源码解析 - Bean创建过程 以及 解决循环依赖
Spring 中的资源文件 bean定义信息,被组装成了 BeanDefinition 存放进了 beanDefinitionMap 容器中,那 bean 是怎样创建和依赖注入的还没有进行分析,而且这里还有个经典的循环依赖问题,本篇文章将带领大家一起继续上篇文章进行Spring源码的分析,梳理下`Bean`创建过程以及循环依赖问题的解决。原创 2023-03-20 18:14:07 · 1709 阅读 · 0 评论 -
Spring 源码解析 - Bean资源加载注册过程
的使用情况,可以发现在容器关闭时也对其进行了上锁,主要就是为了防止放生冲突,在锁中可以看到又触发了很多方法,逻辑比较多,这里主要看。对象时会对已经初始化好的对象进行记录,因此这里可以用来判断容器是否初始化完成,如果容器已经初始化,则为了避免数据的不统一,这里对。中的命名空间是否是默认的还是自定义的,如果是自定义的则使用用户自定义的解析规则,否则使用默认的解析,由于前面例子中的。去容器中获取,如果容器中存在,并不允许覆盖,则抛出异常,还会判断容器中的。方法中,在该方法中,将读取资源文件为输入流,然后使用。原创 2023-03-15 19:18:38 · 642 阅读 · 0 评论 -
Semaphore 源码解读
通过阅读Semaphore的源码可以发现,大量依赖于AQS中提供的方法,如果有阅读过ReentrantLock 锁源码的分析,可以发现相似度极高,都是使用AQS所提供的的特征实现某些场景的应用。原创 2023-03-09 21:00:00 · 485 阅读 · 0 评论 -
ReentrantLock 源码解读
通过阅读的源码可以发现,大量依赖于AQS中提供的方法,所以在阅读前一定要理解下AQS的作用和功能。原创 2023-03-08 21:30:00 · 434 阅读 · 0 评论 -
AQS 源码解读
AQS不做具体的某个场景的应用,但通过其内部维护的FIFO队列和共享资源state便可以实现很多种不同的场景,在阅读了AQS源码后,应该有了更深入的理解,后面再去看等的源码会发现很容易理解。原创 2023-03-07 23:13:00 · 838 阅读 · 1 评论 -
Condition 源码解读
通过上面的源码分析,应该对Condition有了新的理解和掌握,细心地小伙伴应该可以发现在源码中好多地方都使用了CAS,因此当竞争资源非常激烈时,Lock的性能要远远优于。原创 2023-03-05 17:30:46 · 594 阅读 · 0 评论 -
CopyOnWriteArrayList 源码解读
当new新建一个后会生成一个数组array来存放添加的内容,如果是无参的构造函数,则array的长度为0,添加数据时再进行扩容。同时会声明一个锁。当进行add操作时,先进行上锁,然后对当前的array进行copyOf,并且新的长度是之前的长度+1,这样才能存放当前新的值,将新值填充后,再替换掉旧的array数组后,释放当前锁。当使用get获取数据时,无需上锁,直接读取当前array数组的指定位置。当使用remove时,同样先进行上锁,然后再获取当前的array。原创 2023-03-05 15:19:12 · 755 阅读 · 0 评论 -
Seata 源码分析 - tm、rm 中 xid 传递过程
一、Seata前面文章讲解了对 Seata 的 AT 和 TCC 模式的使用,本篇文章为大家讲解下 Seata 中 TM、RM 中 xld 传递过程,如果不了解 Seata 中的 xld,可以理解为全局的事物 ID,我们都知道 Seata 中分了三个角色,TC、TM、RM,其中 TC 为全局事物的协调者,TM 则为全局事物的发起者,RM 为全局事物的参与者,其中 TM 和 RM 我们可以看作一个组,有发起者必定有参与者,不然也没必要使用分布式事物了。那 TC 怎么知道谁和谁是一个组的呢,那就是本篇文章说原创 2022-03-13 15:11:05 · 3707 阅读 · 1 评论 -
MyBatis 原理 及 源码分析( SqlSessionFactory、SqlSession、代理接口,一二级缓存 )下
接上篇文章:https://blog.csdn.net/qq_43692950/article/details/115840155一、SqlSession 获取Mapper执行源码解读上篇文章分析已经拿到了一个DefaultSqlSessionFactory,下面肯定需要从工厂中获取一个SqlSession ,会使用SessionFactory.openSession() 方法,我们先点进去看下,因为上面说道我们获取的是DefaultSqlSessionFactory,所以要进到DefaultSq原创 2021-04-19 23:40:55 · 5700 阅读 · 1 评论 -
MyBatis 原理 及 源码分析( SqlSessionFactory、SqlSession、代理接口,一二级缓存 )上
一、回顾Mybatis的使用Mybatis应该时现在我们项目中使用非常频繁的框架,它几乎消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装,让我们可以使用简单的XML或注解用于配置和原始映射。还记得我们在配置Mybatis的时候都要写一个 mybatis_config.xml 最常写的应该数据库连接信息,还有Mapper.xml 的映射地址,就比如下面这个简单的配置:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE c原创 2021-04-18 22:50:45 · 5692 阅读 · 1 评论 -
服务治理 Eureka 源码解读及运行原理
一、Eureka服务注册与发现原理在看源码之前,先了解下Eureka Server端和Client端的运行原理:在启动Eureka Server端的时候,会使用jax-rs 释放RESTful风格的接口供Client端调用传递信息。当启动Eureka Client端的时候,jersey 类似HttpClient的工具发送Http请求给服务端,将自身的...原创 2021-04-10 23:31:00 · 5553 阅读 · 2 评论