
Spring源码分析系列
文章平均质量分 88
记录的是spring源码分析学习过程
技术路上的苦行僧
不怕别人天赋比你高,就怕别人比你更努力
展开
-
Spring源码解析(35)之Spring全体系源码流程图
画了一个spring全体系的流程图,spring容器创建过程,spring生命周期过程,AOP过程,Spring事务执行过程。原创 2024-10-24 10:59:54 · 419 阅读 · 0 评论 -
Spring源码解析(34)之Spring事务回滚流程
在上一个篇章我们主要介绍了Spring事务的运行流程,也带着一步步debug看了整个事务的运行流程,但是还是欠缺了Spring事务的回滚的流程。在上篇也主要介绍了Spring事务的传播特性,这里还是要看一下Spring事务的传播特性,因为不同的事务传播特性在回滚时会用不同的操作。接下来将看下在不同的事务传播特性下,Spring事务回滚是如何去操作的,下面调试代码。我们外层事务跟内层事务的隔离级别都是required,然后在内层事务中制造出来一个异常,看下Spring事务是如何处理的。原创 2024-08-19 14:19:15 · 878 阅读 · 0 评论 -
Spring源码解析(33)之声明式事务的运行流程
在上一节中我们主要介绍了Spring声明式事务主要是准备了哪些对象,以下是XML配置以及注解配置各自引入的对象。接一下我们就开始通过debug来一步步跟踪spring事务的运行流程是怎么做。在做这件事提前,我们需要提前了解一下Spring的传播特性。原创 2024-08-16 14:41:45 · 1143 阅读 · 0 评论 -
Spring源码解析(32)之注解配置的声明式事务处理
在上一节中我们主要是介绍了事务配置文件的解析,我们知道他往容器中主要是注入了一下类。这里我们主要介绍如果是注解的声明式事务Spring是如何去进行解析的。以下是实例代码。原创 2024-08-14 13:54:57 · 915 阅读 · 0 评论 -
Spring源码解析(31)之事务配置文件解析以及核心对象创建过程
而我们知道AOP是基于IOC的一个拓展,而事务又是基于AOP的一个拓展,所以这个TransactionInterceptor他直接实现了对应的MethodIntercetor接口,他就能够实现拦截器功能,然后在对应的invoke方法实现对应的控制事务的方法,这个后续会看到,我们先继续往下看他对应的核心对象生成。此时我们去看一下一级缓存里面已经创建好的对象有哪些。在创建这个advisor的时候,就会属性注入的时候就创建他对应的需要的两个属性,一个是pointcut对象一个是advice对象。原创 2024-08-12 11:06:46 · 390 阅读 · 0 评论 -
Spring源码解析(30)之AOP拦截链执行过程
在上一节中我们介绍了AOP动态代理对象的创建过程,并且看到了Spring AOP在生成calllBacks的时候第一个拦截器就是:DynamicAdvisorInterceptor,所以我们通过代理对象执行对应的方法的时候就如跳入到这个拦截器中,接下来我们继续跟着这个拦截器源码往下执行。原创 2024-08-07 18:52:46 · 760 阅读 · 0 评论 -
Spring源码解析(29)之AOP动态代理对象创建过程分析
在上一节中我们已经介绍了在createBean过程中去执行AspectJAutoProxyCreator的after方法,然后去获取当前bean适配的advisor,如果还不熟悉的可以去看下之前的博客,接下来我们分析Spring AOP是如何创建代理对象的,在此之前如果对于JDK动态代理以及cglib源码不熟悉的也先去看一下之前对于这两个代理的源码分析博客。原创 2024-08-06 16:43:22 · 703 阅读 · 0 评论 -
Spring源码解析(28)之AOP的核心对象创建过程总结
以上是对AOP核心对象创建的一个总结,接下来我们分点介绍我们自从定义了aop.xml之后,spring在启动的时候是怎么创建了这些核心对象的。getAdvicesAndAdvisorsForBean在这个方法中首先会去获取容器中所有的advisor对象。原创 2024-08-02 13:48:08 · 683 阅读 · 0 评论 -
Spring源码解析(27)之AOP的核心对象创建过程2
我们在上一节中已经介绍了Advisor的创建过程,当时我们创建的logUtil这bean,他在resolveBeforeInstantiation返回的是null,那么就会继续往下执行doCreateBean方法。原创 2024-08-01 18:18:02 · 842 阅读 · 0 评论 -
Spring源码解析(26)之AOP的核心对象创建过程
很明显logUtil就需要跳过并且返回null,所以在 resolveBeforeInstantiation方法中,如果是第一次调用那么他就会去寻找所有的Advisor对象,如果这些Advisor对象没有创建,那么就会创建他们,如果创建了那么就直接从容器中获取,如果获取得到了advisor对象,那么就会判断当前的对象是否是切面对象,如果是切面对象,那么就会跳过不创建代理对象。这里就提前把Advisor对象给提前创建好了,然后就会判断当前类是否是切面对象,如果是切面对象,那就是应该跳过不创建代理对象。原创 2024-08-01 10:57:37 · 839 阅读 · 0 评论 -
Spring源码解析(25)之AOP的BeanDefinitiion准备
以上是常规xml配置aop文件准备,下面是具体的切面java类准备。以上的例子就比较简单,就是在xml里面配置对应的aop切点、切面,接下来我们看下在spring AOP源码中是如何运行的。原创 2024-07-30 18:10:51 · 975 阅读 · 0 评论 -
Spring源码解析(24)之JDK动态代理与cglib动态代理源码解析
一、前言 我们知道AOP生成代理对象底层是根据JDK动态代理或者是Cglib动态代理,如果不熟悉代理模式的可以先去看下:设计模式(20)之代理模式_技术路上的苦行僧的博客-优快云博客,下面直接来分析对应的源码。二、JDK动态代理源码分析下面先来看下我们一般是如何使用JDK动态代理的。/** * @author maoqichuan * @date 2022年03月22日 18:42 */public class CalculatorProxy { public s...原创 2022-03-23 11:30:32 · 987 阅读 · 0 评论 -
Spring源码解析(23)之bean创建流程之look-up标签使用
一、前言在上一篇博客中,说到一个问题,在Spring中如果我们要在一个单例bean中保存一个protype类型的bean,那该怎么操作? 我们知道bean的创建经历过几个比较重要的方法:getBean ->doGetBean ->createBean ->doCreateBean,我们先来看下look-up标签的使用。...原创 2022-03-09 14:39:20 · 365 阅读 · 0 评论 -
Spring源码解析(22)之bean创建流程之FactoryBean
一、前言在上一节我们主要说了Spring在实例化bean前做的一些工作,主要是注册转换器以及属性解析器并且会冻结目前已经注册的BeandDefinition。 protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // 1. 初始化此上下文的转换服务,用来自定义将Spring中的某个Bean的属性从一个类型转换到另外一个类型. // 判...原创 2022-03-02 11:43:43 · 1575 阅读 · 1 评论 -
Spring源码解析(21)之bean创建流程之转换器
一、前言在前面的几节中我们已经介绍完refresh()的其他方法了,接下来就是finishBeanFactoryInitialization方法,初始化所有剩余的单实例Bean(没有使用懒加载的Bean).整个Spring IOC的核心,接下来我们看看这个方法到底做了哪些事情? protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // 1. 初...原创 2022-02-28 15:08:21 · 613 阅读 · 0 评论 -
Spring源码解析(20)之refresh(8)-BeanPostProcessor源码分析
一、前言我们在之前已经介绍完了BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor,还介绍了Spring中比价重要的一个类:ConfigurationClassPostProcessor,接下来我们就要看下BeanPostProcessor执行源码分析。那BeanFactoryPostProcessor和BeanPostProcessor到底有什么区别呢?其实主要是作用的对象不同,BeanFactoryPostPro...原创 2022-02-25 20:20:13 · 340 阅读 · 0 评论 -
Spring源码解析(19)之refresh(7)-SpringBoot自动装配原理
一、前言我们这上一节中主要是介绍了ConfigurationClassPostProcessor,有没有细心的人发现,我们@Import注解的解析源码还没有分析,这一节我们来具体分析。还有在面试的时候想必大家都有被问到过SpringBoot的自动装配原理,这里结合@ ConfigurationClassPostProcessor,以SpringBoot自动装配开始分析我们@Import注解是如何解析的,并且说一说SpringBoot的自动装配原理。 首先来看下Spr...原创 2022-02-25 14:30:32 · 714 阅读 · 0 评论 -
Spring源码解析(18)之refresh(6)-ConfigurationPostProcessor源码分析
一、前言我们在上一篇的博客最后有提到了ConfigurationClassPostPorcessor,我们上节博客有说到之前Spring配置文件需要支持注解的时候只要在Spring配置文件中加入:<context:component-scan base-package="com.springframework.configrationclass"></context:component-scan> 在上节也带大家看了这个标签对应的解析类,解...原创 2022-02-24 11:14:39 · 517 阅读 · 0 评论 -
Spring源码解析(17)之refresh(5)-BeanFactoryPostProcessor执行流程源码分析
一、BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor的区别 这里我们把BeanDefinitionRegistryPostProcessor简称为:BDRPP,BeanFactoryPostProcessor简称为:BPP,首先BDRPP继承了BPP,所以它不仅有BPP的方法:postProcessBeanFactory并且有自己的方法:postProcessBeanDefinitionRegistry,那他们的区别主...原创 2022-02-22 14:46:39 · 604 阅读 · 0 评论 -
Spring源码解析(16)之refresh(4)-prepareBeanFactory源码分析
一、前言 在这一篇博客中我们主要是介绍prepareBeanFactory方法,bean工厂的初始化准备工作,设置bean工厂的一些属性值,需要忽略哪一些接口,需要注册哪一些bean,需要设置哪一些bean的后置处理器等。接下来我们看具体的源码分析,并且这里我们还看看Spring属性编辑器,以及我们如果去拓展一个属性编辑器。protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {...原创 2022-02-21 16:23:40 · 582 阅读 · 0 评论 -
Spring源码解析(15)之refresh源码分析(三)配置文件解析
一、前言在前面的博客中我们有介绍到refresh方法中的otainFreshBeanFaction方法,这个方法的作用就是获取bean工厂,在这期间还会完成配置文件的加载,生成BeanDefinition,需要注意的是这里生成的BeanFactory默认的是DefaultListableBeanFactory,需要注意的是,我们自定的一些xsd约束文件也是在这里完成解析,通过实现BeanDefitionParser接口,并且实现parse方法,自定义的标签也通过实现NamespaceHandlerSup原创 2022-02-20 17:21:43 · 564 阅读 · 0 评论 -
Spring源码解析(14)之refresh源码分析(二)
一、前言 在上篇中Spring源码解析(13)之refresh源码分析(一)_jokeMqc的博客-优快云博客我们已经介绍了ClassPathXmlApplicationContext前两个方法的作用,没有看到我上一篇的文章的可以先去看下上一篇对于ClassPathXmlApplicationContext的介绍。 接下来我们就要对refresh方法的13个方法进行具体的源码分析了...原创 2022-01-04 17:39:06 · 790 阅读 · 0 评论 -
Spring源码解析(13)之refresh源码分析(一)
一、前言在之前我们已经对spring的生命周期、AOP、事物等源码有了大体的分析,其中在对源码分析中大家有看到过refresh方法,Spring容器创建之后,会调用它的refresh方法,refresh的时候会做很多事情:比如完成配置类的解析、各种BeanFactoryPostProcessor和BeanPostProcessor的注册、国际化配置的初始化、web内置容器的构造等等。接下来我们以ClassPathXmlApplicationContext这容器入手看整个refresh方法到底做了哪些原创 2022-01-03 01:50:16 · 888 阅读 · 0 评论 -
Spring源码解析(12)之事务源码分析(下)
接下来我们会分析事务代理对象调用流程,如果还没有看过我spring源码分析上篇的同学,大家最好是先去看下对应创建事务代理对象的流程,然后再来学习事务代理对象的调用流程。一、调用代理对象流程 1.1org.springframework.aop.framework.JdkDynamicAopProxy#invoke @Override public Object invoke(Object proxy, Method method, Object[] args) ...原创 2021-12-13 17:05:17 · 694 阅读 · 1 评论 -
Spring源码解析(11)之事务源码分析(上)
一、事务的概念1.1什么是事务 事务就是逻辑上的一批执行单元,它们要么都执行,要么都不执行。1.2事务的特性(ACID) ACID就是数据库管理系统DBMS中事务所具有的的四个特性。atomicity:原子性,原子性表现为操作不能 被分割,一个事务由一系列数据库操作组成一个完整的逻辑过程,比如银行转账,原账户扣减、新账户增加金额,这两个操作要么都不完成,要么都完成,如果事务出错了,那就回回滚事务; Consistency[一致性]:数据...原创 2021-12-13 15:39:22 · 606 阅读 · 0 评论 -
Spring源码解析(10)之Spring 是如何解决循环依赖的
之前有篇章有介绍过spring是如何解决循环依赖Spring源码解析(7)之循环依赖解决_jokeMqc的博客-优快云博客的,但是我看了之后感觉说的比较的简单,这里再结合spring的源码,说明spring是如何解决循环依赖的。 一、什么是循环依赖所谓的循环依赖就是A依赖B,B依赖A,或者是A依赖B,B依赖C,C依赖A。 代码实例:getter/setter public class InstanceA { ...原创 2021-11-16 15:26:14 · 677 阅读 · 0 评论 -
Spring源码解析(9)之AOP(下)
在spring AOP源码分析上篇Spring源码解析(8)之AOP(上)_jokeMqc的博客-优快云博客主要是分析了EnableAspectJAutoProxy注解给我们做了什么事情,然后具体分析了AnnotationAwareAspectJAutoProxyCreator做了什么事情,目前我们分析的源码可以得到,他主要是做了两件事情,第一寻找出所有的增强器,第二创建代理对象。接下来我们来分析代理对象是如何调用目标方法的。 一、背景知识@Enabl...原创 2021-11-16 11:30:46 · 670 阅读 · 0 评论 -
Spring源码解析(8)之AOP(上)
一、什么是AOP 1.1 AOPAOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善,OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全...原创 2021-11-05 11:47:25 · 290 阅读 · 0 评论 -
Spring源码解析(7)之循环依赖解决
一、前言 在之前的博客中已经介绍到了Spring的bean的实例化过程,但是介绍到doCreateBean并没有详细去介绍,这里会接着去介绍doCreateBean具体做了什么事情,大家如果没有阅读过之前的博客,可以先去了解一下bean的加载过程,在我之前的博客都有具体的介绍。Spring源码解析(5)之bean实例化过程(上)_jokeMqc的博客-优快云博客 下面是getBean的生命周期草图,大家要理解这张图才能够对Spring是如何解决循环依赖以及有哪些循环依赖...原创 2021-10-19 20:31:07 · 270 阅读 · 0 评论 -
Spring源码解析(6)之bean实例化过程(下)
一、前言 Spring的Bean的实例化过程源码分析太过复杂,为了避免篇章过长,这里分为上下篇来进行分析,大家可以先去阅读上篇Spring源码解析(5)之bean实例化过程(上)_jokeMqc的博客-优快云博客,然后接着再来阅读这篇。 1.1...原创 2021-10-18 17:15:36 · 687 阅读 · 0 评论 -
Spring源码解析(5)之bean实例化过程(上)
一、前言进过前面的分析,接下来就是对面bean加载的过程,其实bean的加载加载过程远比bean的解析要复杂的很多,下面我们对下面的这行代码后面的作用为切入点。public class MainClass { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(...原创 2021-10-17 20:19:44 · 426 阅读 · 0 评论 -
Spring源码解析(3)之容器前期准备
写了BeanFactoryPostProcessor的博客才发现,需要提前先介绍spring在解析之前做的容器准备,要不然感觉直接介绍解析源码的话,会有一点懵逼,这里会介绍Spring容器前期准备。 这里问题问题:AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);这句代码相信很多人都用过并且很熟悉,但是大家有思考过,它为了我们做了...原创 2021-10-11 16:58:45 · 330 阅读 · 0 评论 -
Spring源码解析(4)之BeanFactoryPostProcessor 处理源码流程
一、BeanFactoryPostProcessor处理流程执行时间:所有的Bean定义信息已经加载到容器中,但是Bean实例还没有被初始化 下面我们自己定义一个BeanFactoryPostProcessor,Spring提供了对BeanFactory进行操作的处理器BeanFactoryProcessor,简单来说就是获取容器BeanFactory,这样就可以在真正初始化bean之前对bean做一些处理操作,允许我们在bean工厂里面的所有bean被加载出来但是还有...原创 2021-10-11 15:15:23 · 566 阅读 · 0 评论 -
Spring源码解析(2)之扩展原理ApplicationListener事件发布源码解析
一、Spring是发布事件源码流程1.1)首先我们自己写一个TulingApplicationListener 实现ApplicationListener接口,并且把该组件加入到容器中./** * 创建一个监听器 */@Componentpublic class TulingApplicationListener implements ApplicationListener { @Override public void onApplicationEvent(Applic原创 2021-10-09 16:59:26 · 481 阅读 · 0 评论 -
Spring源码分析(1)之常见底层核心注解
一、Spring框架整体功能介绍1、Spring Core Container:模块作用:Core 和 Beans 模块是框架的基础部分,提供 IoC (转控制)和依赖注入特性。 这里的基础概念是BeanFactory,它提供对 Factory 模式的经典实现来消除对程序性单例模式的需要,并真 正地允许你从程序逻辑中分离出依赖关系和配置.1.1) Core 主要包含 Spring 框架基本的核心工具类, Spring 的其他组件都要用到这个包...原创 2021-09-29 13:55:56 · 790 阅读 · 1 评论