Spring @Transactional 注解是如何执行事务的?

2021-06-25
阅读 5 分钟
5.2k
前言相信小伙伴一定用过 @Transactional 注解,那 @Transactional 背后的秘密又知道多少呢?Spring 是如何开启事务的?又是如何进行提交事务和关闭事务的呢?画图猜测在开始 debug 阅读源码之前,小伙伴们应该已经知道 MySQL 是如何开启事务的。因此可以得出猜测:那下面跟着源码一起读一读,Spring 的 @Transactional ...

Spring 事务、异步和循环依赖有什么关系?

2021-02-02
阅读 4 分钟
2.3k
前言在循环依赖中有一种循环依赖,就是自注入:自己依赖自己。事务的自注入在 Spring 自调用事务失效,你是怎么解决的? 有小伙伴提出可以自己注入自己来解决事务失效。具体使用方式如下: {代码...} 是不是发现很神奇的事情,事务生效了。其实这里注入自己,其实是注入的一个代理对象,调事务,也是调的代理对象的事务...

Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?

2021-01-31
阅读 6 分钟
3.5k
前言在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的。同样在上一节留下了疑问:循环依赖为什么要使用三级缓存?而不是使用二级缓存?AOP 动态代理对循环依赖的有没有什么影响?本篇文章也是围绕上面的内容进行展开。笔记也在不断整理,之前可能会有点杂乱。循序渐进,...

Spring 是如何解决循环依赖的?

2021-01-26
阅读 5 分钟
16.5k
Requested bean is currently in creation: Is there an unresolvable circular reference?

Spring 源码学习 16:单例 Bean 创建

2021-01-21
阅读 13 分钟
1.8k
在 finishBeanFactoryInitialization 中介绍了创建 Bean 的流程大概流程,这里进入单例 Bean 的创建过程。

Spring 源码学习 15:finishBeanFactoryInitialization(重点)

2021-01-19
阅读 16 分钟
2k
前言可以说前面的都是准备工作,而接下来开始的才是重点,在这一步会完成 BeanFactory 的初始化,同时实例化单例 Bean。具体怎么操作的,那就一起阅读源码吧!不过在阅读源码之前,还是需要了解一些知识的。什么是 FactoryBean ?FactoryBean 是如何使用的 ?Bean 是如何初始化的?常说的循环依赖是怎么解决的?什么是 F...

Spring 源码学习 14:initApplicationEventMulticaster、onRefresh

2021-01-13
阅读 5 分钟
1.8k
上一篇介绍了国际化的使用以及初始化消息源的源码,接下来接着往下阅读,将进入 initApplicationEventMulticaster 、onRefresh 和 registerListeners 的相关操作逻辑。

Spring 源码学习 13:initMessageSource

2021-01-04
阅读 4 分钟
1.8k
在阅读完 registerBeanPostProcessors 源码之后, 下一步就进入到 initMessageSource,这一步主要作用是初始化国际化文件。

Spring 源码学习 12:registerBeanPostProcessors

2021-01-02
阅读 7 分钟
2.4k
前面通过 invokeBeanFactoryPostProcessors 这一步了解到了什么是 BeanFactoryPostProcessor ,以及 BeanFactoryPostProcessor 的使用及作用,并通过 invokeBeanFactoryPostProcessors 这一步源码,对 BeanFactoryPostProcessor 的加载流程有了进一步了解。

Spring 源码学习 11:invokeBeanFactoryPostProcessors

2020-12-28
阅读 14 分钟
1.6k
知道了上面两个问题的答案,对 BeanFactoryPostProcessor 有了了解之后,然后再深入源码,继续阅读 invokeBeanFactoryPostProcessors 这个方法。

Spring 源码学习 10:prepareBeanFactory 和 postProcessBeanFactory

2020-12-27
阅读 4 分钟
2.8k
根据 refresh 流程,当 obtainFreshBeanFactory 执行结束后,下一步会执行 prepareBeanFactory ,顾名思义,这个方法主要是准备 BeanFactory,下面一起看一看这部分逻辑。

Spring 源码学习 08:register 注册配置类

2020-12-23
阅读 2 分钟
1.8k
前言看完无参构造的源码及流程之后,后面将会执行 register 方法。register 方法,入参是我们的配置类 JavaConfig.class ,下面跟着源码继续往下走!源码分析this.reader.register(componentClasses);这里执行的是 reader 的方法,入参就是传入的 JavaConfig.class。reader 在之前初始化,就是注册一些 PostProcessor。...

Spring 源码学习 07:ClassPathBeanDefinitionScanner

2020-12-15
阅读 2 分钟
1.1k
AnnotationConfigApplicationContext 构造函数除了初始化一个 reader ,还有一个 scanner,下面来一起看看 ClassPathBeanDefinitionScanner 都有什么逻辑。

Spring 源码学习 06:AnnotatedBeanDefinitionReader

2020-12-10
阅读 2 分钟
1.6k
前言BeanDefinition 的概念也了解了,也知道一个 Bean 在 Spring 中定义的信息有哪些之后,继续言归正传。源码分析在初始化时会先生成一个 reader ,进入方法,其实是走的下面的逻辑:其中 getOrCreateEnvironment(registry) 会返回一个 Environment 用来表示当前的运行环境之类的。ConditionEvaluator 是用来完成对 @Co...

Spring 源码学习 05:BeanDefinition 概念及其实现

2020-12-08
阅读 3 分钟
1.4k
BeanDefinition:顾名思义,就是 Bean 的定义,是用来描述一个 Bean 都有什么信息。前面说在初始化 DefaultListableBeanFactory 时,会初始化一个 Map<String, BeanDefinition>,这个 Map 的功能暂且不说,(PS:查资料说的是存储 bean),所以今天就结合官方文档以及源码,一起了解一下 BeanDefinition!

Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory

2020-12-03
阅读 3 分钟
1.6k
在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程。

Spring 源码学习 03:创建 IoC 容器的几种方式

2020-12-02
阅读 2 分钟
1.1k
前言在上一篇文章末尾画了一幅简图,现在从简图这入手,先来看看如何创建容器!创建容器在搭建 Spring 源码阅读环境 时,最后举了一个例子,其实就是创建容器,并从容器中获取 Bean ,来测试环境是否 OK。根据元数据的不同,创建容器的方式也不同,下面参考官方文档,简单介绍下创建容器的几种方式:Java 配置获取元数据...

Spring 源码学习 02:关于 Spring IoC 和 Bean 的概念

2020-12-01
阅读 2 分钟
1.3k
前言在前一篇文章中介绍了如何构建源码阅读环境,既然构建好了源码环境,本地也可以正常运行,那就开始阅读源码吧!在阅读源码时,会参考官方文档,很多概念在官网都可以得到答案,有兴趣的小伙伴们可以继续阅读,当做复习,写的不足之处,希望多多指导。IoC 和 DIIoCIoC(Inversion of Control),即控制反转。之前是在...

Spring 源码阅读环境的搭建

2020-11-27
阅读 3 分钟
3.8k
前言本文记录了 Spring 源码环境的搭建方式,以及踩过的那些坑!​当前版本:5.3.2-SNAPSHOT。环境准备GitJDKmaster 分支需要 JDK 115.2.x 分支, JDK8 即可Gradle 6.5.1IDEA 最新 (2020.2.3)Spring 源码仓库地址:[链接]下载源码clone 源码 {代码...} 使用 IDEA 打开等待 IDEA 加载完成即可。注: 也可以指定 clone 的...

Spring 自调用事务失效,你是怎么解决的?

2020-11-09
阅读 4 分钟
7.1k
前言相信大家都遇到一种事务失效场景,那就是 Spring 自调用,就是在 Service 方法内,调用另一个加 @Transactional 注解的方法,发现事务失效,这时候你是怎么解决的呢?

几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!

2020-11-08
阅读 5 分钟
2.4k
前言新项目查日志太麻烦,多台机器之间查来查去,还不知道是不是同一个请求的。打印日志时使用 MDC 在日志上添加一个 traceId,那这个 traceId 如何跨系统传递呢?