Spring
文章平均质量分 93
程序员小航
这个作者很懒,什么都没留下…
展开
-
Spring @Transactional 注解是如何执行事务的?
前言相信小伙伴一定用过 @Transaction 注解,那 @Transaction 背后的秘密又知道多少呢?Spring 是如何开启事务的?又是如何进行提交事务和关闭事务的呢?画图猜测在开始 debug 阅读源码之前,小伙伴们应该已经知道 MySQL 是如何开启事务的。因此可以得出猜测:那下面跟着源码一起读一读,Spring 的 @Transaction 注解是如何执行事务逻辑的?Spring 事务执行流程开启事务这里使用的是 Spring Boot + MySQL + Druid&原创 2021-06-25 10:43:51 · 342 阅读 · 1 评论 -
Spring 事务、异步和循环依赖有什么关系?
前言在循环依赖中有一种循环依赖,就是自注入:自己依赖自己。事务的自注入在 Spring 自调用事务失效,你是怎么解决的? 有小伙伴提出可以自己注入自己来解决事务失效。具体使用方式如下:@Slf4j@Servicepublic class OrderBizServiceImpl implements OrderBizService { // 注入自己 @Autowired private OrderBizService orderBizService; @O原创 2021-02-02 17:25:56 · 286 阅读 · 0 评论 -
Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?
前言在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的。同样在上一节留下了疑问:循环依赖为什么要使用三级缓存?而不是使用二级缓存?AOP 动态代理对循环依赖的有没有什么影响?本篇文章也是围绕上面的内容进行展开。笔记也在不断整理,之前可能会有点杂乱。循序渐进,看一看什么是循环依赖?开始先简单回顾一下 Bean 的创建过程,当然小伙伴也可以直接阅读『 单例 Bean 的创建 』这篇文章。不过考虑到阅读本文前再阅读上一篇文章、原创 2021-01-31 12:39:29 · 1083 阅读 · 7 评论 -
Spring 是如何解决循环依赖的?
前言相信很多小伙伴在工作中都会遇到循环依赖,不过大多数它是这样显示的:还会提示这么一句:Requested bean is currently in creation: Is there an unresolvable circular reference?老铁!这就是发生循环依赖了!当然这里是一个异常情况。在我的一篇文章中介绍如何避免 Spring 自调用事务失效,其中网友给建议,说可以在类中注入自身,然后调用,而注入自身的过程也是循环依赖的处理过程。下面就一起看一看,什么是循环依赖,以及原创 2021-01-26 12:11:18 · 304 阅读 · 0 评论 -
Spring 源码学习 16:单例 Bean 创建
前言在 finishBeanFactoryInitialization 中介绍了创建 Bean 的流程大概流程,这里进入单例 Bean 的创建过程。这里主要分为三个部分创建单例 BeangetSingletoncreateBeangetObjectForBeanInstance下面进入源码:getSingletonpublic Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {原创 2021-01-21 14:40:50 · 354 阅读 · 0 评论 -
Spring 源码学习 15:finishBeanFactoryInitialization(重点)
前言可以说前面的都是准备工作,而接下来开始的才是重点,在这一步会完成 BeanFactory 的初始化,同时实例化单例 Bean。具体怎么操作的,那就一起阅读源码吧!不过在阅读源码之前,还是需要了解一些知识的。什么是 FactoryBean ?FactoryBean 是如何使用的 ?Bean 是如何初始化的?常说的循环依赖是怎么解决的?什么是 FactoryBean ?在官网的这篇文章《What’s a FactoryBean?》中有相关解答,有兴趣的小伙伴可以看一下。由内部使用的对原创 2021-01-19 10:57:34 · 195 阅读 · 0 评论 -
Spring 源码学习 14:initApplicationEventMulticaster、onRefresh 和 registerListeners
前言上一篇介绍了国际化的使用以及初始化消息源的源码,接下来接着往下阅读,将进入 initApplicationEventMulticaster 、onRefresh 和 registerListeners 的相关操作逻辑。这一部分主要是初始化事件广播器以及注册监听器。而 onRefresh 部分则需要子类去实现。 所以本文主要介绍以下几个部分:什么是 Spring 事件?监听器是如何使用的?什么是 Spring 事件?这块的介绍在官网 1.15.2. Standard and Custom原创 2021-01-13 22:56:43 · 238 阅读 · 0 评论 -
Spring 源码学习 13:initMessageSource
前言在阅读完 registerBeanPostProcessors 源码之后, 下一步就进入到 initMessageSource,这一步主要作用是初始化国际化文件。依然如之前所示,先通过官网了解到国际化的用法,然后再对源码进行研究。MessageSource 国际化如官网1.15.1. Internationalization using MessageSource所示,主要作用就是使用国际化,定制不同的消息。需要注意的是 MessageSource 定义的 Bean 名字必须为 messag原创 2021-01-04 22:16:20 · 331 阅读 · 0 评论 -
Spring 源码学习 12:registerBeanPostProcessors
前言前面通过 invokeBeanFactoryPostProcessors 这一步了解到了什么是 BeanFactoryPostProcessor ,以及 BeanFactoryPostProcessor 的使用及作用,并通过 invokeBeanFactoryPostProcessors 这一步源码,对 BeanFactoryPostProcessor 的加载流程有了进一步了解。现在就一起进入下一个环节:registerBeanPostProcessors(beanFactory);这一步主要的原创 2021-01-02 17:38:20 · 367 阅读 · 0 评论 -
Spring 源码学习 11:invokeBeanFactoryPostProcessors
前言invokeBeanFactoryPostProcessors 会执行 BeanFactory 的后置处理器。看到这里会有疑问:什么是 BeanFactoryPostProcessor ?BeanfactoryPostProcessor 该如何使用?知道了上面两个问题的答案,对 BeanFactoryPostProcessor 有了了解之后,然后再深入源码,继续阅读 invokeBeanFactoryPostProcessors 这个方法。作用资料还是在官网可以找到答案:阅读了一下,原创 2020-12-28 23:18:53 · 403 阅读 · 0 评论 -
Spring 源码学习 10:prepareBeanFactory 和 postProcessBeanFactory
前言根据 refresh 流程,当 obtainFreshBeanFactory 执行结束后,下一步会执行 prepareBeanFactory ,顾名思义,这个方法主要是准备 BeanFactory,下面一起看一看这部分逻辑。prepareBeanFactoryprotected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // Tell the internal bean factory to原创 2020-12-27 19:01:56 · 201 阅读 · 0 评论 -
Spring 源码学习 09:refresh 大概流程
前言前面的准备工作结束之后,就是进入核心代码 refresh。源码public void refresh() throws BeansException, IllegalStateException { // 加锁 synchronized (this.startupShutdownMonitor) { StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh")原创 2020-12-23 12:06:42 · 173 阅读 · 0 评论 -
Spring 源码学习 08:register 注册配置类
前言看完无参构造的源码及流程之后,后面将会执行 register 方法。register 方法,入参是我们的配置类 JavaConfig.class ,下面跟着源码继续往下走!源码分析this.reader.register(componentClasses);这里执行的是 reader 的方法,入参就是传入的 JavaConfig.class。reader 在之前初始化,就是注册一些 PostProcessor。循环,注册所有的配置类;doRegisterBean 开始注册。原创 2020-12-07 11:31:09 · 338 阅读 · 0 评论 -
Spring 源码学习 07:ClassPathBeanDefinitionScanner
前言AnnotationConfigApplicationContext 构造函数除了初始化一个 reader ,还有一个 scanner,下面来一起看看 ClassPathBeanDefinitionScanner 都有什么逻辑。源码分析this.scanner = new ClassPathBeanDefinitionScanner(this); 代码如下所示:其中 useDefaultFilters 默认设置的 true。所以最终会执行下面三部分代码:registerDefaultFi原创 2020-12-06 11:02:50 · 462 阅读 · 0 评论 -
Spring 源码学习 06:AnnotatedBeanDefinitionReader
前言BeanDefinition 的概念也了解了,也知道一个 Bean 在 Spring 中定义的信息有哪些之后,继续言归正传。源码分析在初始化时会先生成一个 reader ,进入方法,其实是走的下面的逻辑:其中 getOrCreateEnvironment(registry) 会返回一个 Environment 用来表示当前的运行环境之类的。ConditionEvaluator 是用来完成对 @Conditional 这个条件注解的判断。这块可以参考官网:Environment Abstr原创 2020-12-05 13:41:31 · 304 阅读 · 0 评论 -
Spring 源码学习 05:BeanDefinition 概念及其实现
前言BeanDefinition:顾名思义,就是 Bean 的定义,是用来描述一个 Bean 都有什么信息。前面说在初始化 DefaultListableBeanFactory 时,会初始化一个 Map<String, BeanDefinition>,这个 Map 的功能暂且不说,(PS:查资料说的是存储 bean),所以今天就结合官方文档以及源码,一起了解一下 BeanDefinition!概念在容器内部,使用 BeanDefinition 对象定义一个 Bean。而定义的信息包含 类原创 2020-12-04 10:08:34 · 328 阅读 · 0 评论 -
Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory
前言在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程。入口从 JavaConfig 中加载配置的 AnnotationConfigApplicationContext 启动方式如下:进去之后发现构造其实是调用的当前无参构造。所以在启动时也可以直接声明无参构造,改写为下面这种:public class AnnotationConfigApplicationTes原创 2020-12-03 08:32:43 · 269 阅读 · 0 评论 -
Spring 源码学习 03:创建 IoC 容器的几种方式
前言在上一篇文章末尾画了一幅简图,现在从简图这入手,先来看看如何创建容器!创建容器在搭建 Spring 源码阅读环境 时,最后举了一个例子,其实就是创建容器,并从容器中获取 Bean ,来测试环境是否 OK。根据元数据的不同,创建容器的方式也不同,下面参考官方文档,简单介绍下创建容器的几种方式:Java 配置获取元数据public class AnnotationConfigApplicationTest { public static void main(String[] args)原创 2020-12-02 08:31:28 · 545 阅读 · 0 评论 -
Spring 源码学习 02:关于 Spring IoC 和 Bean 的概念
前言在前一篇文章中介绍了如何构建源码阅读环境,既然构建好了源码环境,本地也可以正常运行,那就开始阅读源码吧!在阅读源码时,会参考官方文档,很多概念在官网都可以得到答案,有兴趣的小伙伴们可以继续阅读,当做复习,写的不足之处,希望多多指导。IoC 和 DIIoCIoC(Inversion of Control),即控制反转。之前是在对象内部 new 创建其他对象,然后使用。而现在 Spring 中有一个容器可以在创建管理这些对象,并且将对象依赖的其他对象注入到这个对象中,这些对象的创建、销毁都由原创 2020-12-01 12:16:19 · 159 阅读 · 0 评论