SpringBoot源码解读与原理分析
文章平均质量分 97
灰色孤星A
卷又卷不赢,躺又躺不平。
展开
-
SpringBoot源码解读与原理分析(四十一)SpringBoot 2.3新特性:优雅停机
在SpringBoot应用需要停机时,如果直接关闭应用,会导致部分正在处理中的请求被强制中断,这在某些业务场景中会产生脏数据。为了解决这一问题,SpringBoot 2.3中引入了“优雅停机”的新特性。原创 2024-03-05 09:03:42 · 816 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(四十)基于jar/war包的运行机制
在一个SpringBoot项目开发完成后,最终需要项目部署到服务器使其正常运行,以提供功能服务使用。部署运行SpringBoot项目的方法一般采用打包部署为主。原创 2024-03-04 22:33:21 · 1202 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(三十九)SpringBoot整合WebWebFlux(二)DispatcherHandler的传统方式和函数式端点工作原理
DispatcherHandler作为WebFlux的核心前端控制器,它的作用与WebMvc中的DispatcherServlet相同,都是负责统一接收客户端请求并处理,然后将结果响应给客户端。由于WebFlux可以完美兼容@RequestMapping注解式开发和函数式端点开发,因此DispatcherHandler的工作原理也可以分为传统方式和函数式。原创 2024-03-02 22:24:13 · 926 阅读 · 2 评论 -
SpringBoot源码解读与原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自动装配
SpringFramework 5.x中对于Web场景的开发提供了两套实现方案:WebMvc与WebFlux。SpringBoot整合WebMvc基于Servlet,本质上是阻塞的,每个连接都会占用一个线程,因此基于Servlet的阻塞式Web框架在面对海量请求时,性能上没有优势。为了解决该问题,SpringFramework 5.0版本后引入了WebMvc的孪生兄弟WebFlux,它是一个异步非阻塞式Web框架。原创 2024-03-01 10:14:35 · 1250 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(三十七)SpringBoot整合WebMvc(二)DispatcherServlet的工作全流程
WebMvc的核心组件装配完成之后,DispatcherServlet作为WebMvc的核心前端控制器正式投入工作,默认接收客户端的所有请求,并调度其它核心组件处理请求,最终响应结果给客户端。本节内容研究WebMvc在实际运行期间DispatcherServlet对于请求处理和响应结果的全流程执行原理。本文内容由于不可割裂,因此具有超长预警。本文沿用。原创 2024-02-29 10:28:20 · 2686 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(三十六)SpringBoot整合WebMvc(一)@Controller控制器装配原理
SpringBoot经常整合的其中一个核心场景是Web开发。SpringFramework 5.x中对于Web场景的开发提供了两套实现方案:WebMvc与WebFlux。原创 2024-02-27 19:33:14 · 1653 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(三十五)SpringBoot整合MyBatis时的核心组件自动装配
在实际SpringBoot项目开发中,更多的场景是整合成熟的持久层框架来完成与数据库的交互。目前比较流行的持久层框架包括SpringData JPA(底层默认依赖Hibernate)和MyBatis。SpringData本身属于Spring生态的一部分,而MyBatis是第三方框架。本章以MyBatis整合SpringBoot的核心场景启动器为切入点,研究MyBatis如何完成与SpringBoot的场景整合。MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。原创 2024-02-27 08:50:20 · 1255 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(三十四)SpringBoot整合JDBC(三)声明式事务的传播行为控制
在实际项目开发中,难免遇到Service之间的相互嵌套。如何控制这些嵌套Service的事务,则涉及到SpringFramework的事务传播行为。原创 2024-02-26 19:22:12 · 719 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(三十三)SpringBoot整合JDBC(二)声明式事务的生效原理和控制流程
SpringBoot整合JDBC的场景中,除了引入spring-jdbc,还会引入spring-tx实现事务控制。在SpringBoot源码解读与原理分析(三十二)SpringBoot整合JDBC(一)JDBC组件的自动装配的示例项目中,在主启动类显式标注了@EnableTransactionManagement注解,用于开启注解声明式事务。但实际上,即便不进行标注,底层仍然会使用自动配置类的方式开启,也就是说SpringBoot默认开启注解声明式事务。原创 2024-02-26 09:38:53 · 844 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(三十二)SpringBoot整合JDBC(一)JDBC组件的自动装配
在实际SpringBoot项目中,通常都离不开与数据库的交互,更多的选择是使用持久层框架MyBatis或SpringData等,而不是原生的spring-jdbc。但学习SpringBoot整合JDBC场景下的组件装配,以及注解声明式事务的生效原理、控制流程、事务传播行为等,依旧是必要的,对后续学习SpringBoot整合持久层框架具有很大帮助。原创 2024-02-25 23:12:10 · 1489 阅读 · 2 评论 -
SpringBoot源码解读与原理分析(三十一)AOP模块的生命周期(四)AspetJ通知的底层实现
在SpringBoot源码解读与原理分析(十六)SpringBoot的AOP支持 5.1.2 通知类型Before前置通知After后置通知AfterReturning返回通知AfterThrowing异常通知Around环绕通知本节梳理下这5中通知类的底层执行逻辑。原创 2024-02-25 11:24:12 · 829 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(三十)AOP模块的生命周期(三)代理对象的底层执行逻辑
在第五章SpringBoot源码解读与原理分析(十六)SpringBoot的AOP支持代码清单1// 组件类:DemoService.java@Service// 切面类:DemoServiceAspect.java@Aspect@Component// 主启动类:Test01App.java可见,AOP代理已经生效。本节来研究下当DemoService的test方法执行时,内部执行了哪些重要环节的操作。原创 2024-02-24 11:49:31 · 695 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(二十九)AOP模块的生命周期(二)代理对象的生成
在AnnotationAwareAspectJAutoProxyCreator的父类AbstractAutoProxyCreator的代码清单1:AbstractAutoProxyCreator.java// ......// 源码注释:如果我们有一个自定义的TargetSource,在这里创建代理;TargetSource将以自定义方式处理目标实例。= null) {由 代码清单1 可知,TargetSource的设计与AOP代理有关。原创 2024-02-23 09:31:13 · 967 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(二十八)AOP模块的生命周期(一)
SpringFramework的两大核心特性是IOC和AOP。第5章已经初步梳理了AOP的核心组件与生效机制(详见SpringBoot源码解读与原理分析(十六)SpringBoot的AOP支持),本章继续深入梳理AOP的启用、生效、运行机制等。原创 2024-02-22 11:05:51 · 1071 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(二十七)嵌入式Tomcat
当Web应用需要部署运行时,传统的做法是将项目打包成war包,然后部署到外置的Web容器中(如最常用的Tomcat容器)。SpringBoot的一大重要特性是支持嵌入式Web容器,基于SpringBoot的Web应用仅凭一个单独的jar包即可独立运行。嵌入式Tomcat是一种可以嵌入到Web应用中,无需单独部署的Tomcat容器。普通的外置Tomcat与嵌入式Tomcat从核心、本质上看没有任何区别,都可以承载Web应用的运行。但SpringBoot整合嵌入式Tomcat容器时在底层设定了一些额外的限制。原创 2024-02-20 14:28:34 · 1317 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(二十六)IOC容器的刷新(七)循环依赖的解决方案
(3)IOC容器第二次创建cat对象时,由于第一次创建cat对象就在原型Bean对象名称的集合prototypesCurrentlyInCreation中存放了“cat”名称,因此第二次创建cat对象时prototypesCurrentlyInCreation集合中已存在“cat”名称,从而抛出BeanCurrentlyInCreationException异常,表示出现了不可解决的循环依赖。由 代码清单11 可知,如果当前正在创建的bean对象的确需要创建代理对象,则会先行创建代理对象,并替换原始对象。原创 2024-02-19 09:40:40 · 1081 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(二十五)IOC容器的刷新(六)
因为ConfigurationClassPostProcessor实现了PriorityOrdered接口,这个接口的优先级最高。原创 2024-02-08 15:53:16 · 708 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(二十四)IOC容器的刷新(五)
所有以AutoProxyCreator结尾的类都与AOP相关,且都是具备代理对象创建能力的后置处理器,可以在bean对象本身的初始化逻辑完成后根据需要创建代理对象。原创 2024-02-07 15:44:12 · 1101 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(二十三)IOC容器的刷新(四)
默认创建的事件广播器的类型是SimpleApplicationEventMulticaster,这是SpringFramework唯一具体的ApplicationEventMulticaster落地实现,因此在没有外部扩展时,负责广播事件的事件广播器就一定是SimpleApplicationEventMulticaster。),早期事件记录了事件广播器尚未初始化时需要广播的事件,这里事件广播器已经初始化了且监听器也关联了,就可以广播这些早期事件了。原创 2024-02-06 09:48:10 · 870 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(二十二)IOC容器的刷新(三)ConfigurationClassPostProcessor
SpringBoot源码解读与原理分析(二十)IOC容器的刷新(一)SpringBoot源码解读与原理分析(二十一)IOC容器的刷新(二)这一节的内容是:在7.5节后置处理器执行阶段的一个重要的BeanDefinitionRegistryPostProcessor:ConfigurationClassPostProcessor。7.5.7 ConfigurationClassPostProcessor由javadoc和官方文档可知,ConfigurationClassPostProcessor的核心原创 2024-02-06 08:50:19 · 1316 阅读 · 2 评论 -
SpringBoot源码解读与原理分析(二十一)IOC容器的刷新(二)
这样做的目的在于:BeanDefinitionRegistryPostProcessor的作用是向BeanDefinitionRegistry中注册新的BeanDefinition,如果这个新的BeanDefinition恰好又是一个BeanDefinitionRegistryPostProcessor,那么这个新的BeanDefinitionRegistryPostProcessor也需要执行其。中提到,此时BeanFactory的落地实现就是一个DefaultListableBeanFactory。原创 2024-02-05 09:15:49 · 1270 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(二十)IOC容器的刷新(一)
由javadoc可知,ApplicationListenerDetector的作用是在bean对象初始化阶段检测当前bean对象是否是ApplicationListener,如果是则会进行一些额外的处理:将该bean对象加入到ApplicationContext的监听器集合中。从上面的分析可知,Aware系列接口的注入使用的是BeanPostProcessor注入的方式,因此使用ignoreDependencyInterface是为了放弃这些Aware接口在BeanFactory中实现的自动依赖注入,原创 2024-02-05 08:50:36 · 1310 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(十九)IOC容器的创建与初始化
借助IDEA可以得知,ApplicationContext实现了ResourcePatternResolver接口,而ResourcePatternResolver的父接口就是ResourceLoader接口,所以ApplicationContext具备资源加载的能力。这两个接口以同样的方式工作,提供一个。IOC容器刷新完毕后,开始执行一些收尾工作,包括打印启动耗时的日志、回调监听器的started方法、回调所有的运行器、回调监听器的started方法,如果发生异常还会广播failed事件。原创 2024-02-04 09:12:40 · 1054 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(十八)启动SpringApplication逻辑分析
由 代码清单16 可知,Binder类将Environment中的一些以 spring.main 开头的配置属性映射到SpringApplication中,而SpringApplication的部分属性恰好就是以 spring.main 开头的,例如。由 代码清单6 可知,异常分析器集合的泛型是SpringBootExceptionReporter类,它是一个用于支持SpringApplication启动错误报告的接口,本身也是利用SPI机制加载的。由 代码清单9 可知,Environment的设计,在。原创 2024-02-02 08:45:33 · 999 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(十七)创建SpringApplication过程
BootstrapRegistry在ApplicationContext初始化之前预先初始化一些重对象,等到ApplicationContext真正需要初始化时,BootstrapRegistry可以将这些重对象共享给ApplicationContext,使得IOC容器不再需要初始化这些重对象,其中涉及到的重要步骤都蟹了注释,下面一一说明。由 代码清单2 可知,创建SpringApplication使用的是new的方式,调用的构造方法只传入了主启动类(primarySources,即主配置资源来源)。原创 2024-02-01 14:11:59 · 1120 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(十六)SpringBoot的AOP支持
本文【5.3.1.2 注册AOP代理创建器】贴出的源码指出,AnnotationAwareAspectJAutoProxyCreator实现了Ordered接口,并且声明了最高优先级,这就是意味着它会比其他的BeanPostProcessor更先创建,从而也会感觉这些普通BeanPostProcessor的初始化。由源码可知,AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,因此具备编程式注册新的BeanDefinition的能力。原创 2024-01-31 12:56:24 · 1046 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(十五)SpringBoot生命周期概述
上一节了解了SpringApplication的整体设计,下面从宏观层面了解一下SpringBoot的应用从开始执行run方法到最终退出的整个生命周期都经历了哪些重要的环节。本节是从宏观层面了解各环节,详细的原理和源码,放到后续的章节再展开。原创 2024-01-30 18:26:59 · 843 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(十四)SpringApplication的总体设计
时,也有生命周期,SpringBoot在该生命周期中扩展了新的切入点,也就是基于SpringApplication的事件监听,其核心监听类是SpringApplicationRunListener,专门用于广播SpringBoot事件。如果被错误配置的bean是延迟初始化的,那么在启动过程中就不会报错,只有在该bean初始化时,问题才会出现。官方文档的后续内容,针对SpringApplication背后非常多的特性进行了详细的解释,这里挑选一些比较重要的特性来讨论下。原创 2024-01-18 09:07:02 · 1122 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(十三)IOC容器的启动流程
从类名可知,这是。原创 2024-01-17 10:27:43 · 1636 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(十二)后置处理器
针对bean对象的后置处理器:BeanPostProcessor针对BeanDefinition的后置处理器:BeanDefinitionRegistryPostProcessor这两种都是针对IOC容器中的Bean,在其生命周期的某一阶段前后进行一些切入处理。BeanPostProcessor切入的时机是bean对象初始化阶段前、后。原创 2024-01-16 11:32:24 · 1361 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(十一)BeanDefinition
BeanDefinition的javadoc并没有提供有价值的信息,但可以从BeanDefinition接口定义的方法入手,来看BeanDefinition包含了哪些定义信息。1.Bean的类信息全限定名(beanClassName)2.Bean的属性作用域(scope)是否默认Bean(primary)描述信息(description)3.Bean的行为特性是否延迟加载(lazyInit)是否自动注入(autowireCandidate)原创 2024-01-15 16:11:34 · 1287 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(十)Environment
SpringBoot源码解读与原理分析第十篇,讲解Environment(环境)组件。原创 2024-01-12 11:33:11 · 1162 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(九)SpringBoot对IOC容器的拓展
SpringBoot源码解读与原理分析原创 2024-01-11 23:22:33 · 990 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(八)ApplicationContext
介绍完接口,接下来是ApplicationContext的几个重要实现类。借助IDEA的结构图,可以看到,ApplicationContext的实现类中,AbstractApplicationContext显得尤为重要:实际上AbstractApplicationContext定义和实现了绝大部分应用上下文的特性和功能。第一段:ApplicationContext接口的抽象实现类。它只是简单地实现了应用上下文的基本功能,并不强制约束配置的承载形式(XML、注解驱动等)。原创 2024-02-07 17:29:00 · 1703 阅读 · 1 评论 -
SpringBoot源码解读与原理分析(七)BeanFactory
AbstractBeanFactory是BeanFactory最基础的抽象实现,只具有部分功能。第一段:AbstractBeanFactory是BeanFactory接口的抽象基类,提供了ConfigurableBeanFactory类SPI的全部能力。可以被用作从某些后端资源获取Bean定义的基类。interface.原创 2024-02-08 14:13:16 · 1111 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(六)WebMvc场景的自动装配
2.1 简单介绍组件装配。2.2-2.4 梳理了SpringFramework的模块装配、条件装配、SPI机制的原理,这三者是自动装配的实现基础。2.5 梳理了SpringBoot的核心特性:自动装配的机制和原理。2.6 通过WebMvc场景的自动装配实例,进一步体会自动装配在具体场景中发挥的作用。SpringBoot源码解读与原理分析。原创 2024-02-09 18:27:33 · 1978 阅读 · 2 评论 -
SpringBoot源码解读与原理分析(五)SpringBoot的装配机制
总结一下SpringBoot的核心@SpringBootApplication和自动装机制。@SpringBootApplication包含@ComponentScan注解,可以默认扫描当前包及其子包下的所有组件。@EnableAutoConfiguration中包含@AutoConfigurationPackage注解,可以记录最外层根包的位置,以便第三方框架整合使用。原创 2024-02-18 18:56:58 · 1658 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(四)SPI机制
模拟一套Dao接口的不同数据库访问支持。原创 2024-03-05 19:50:53 · 1143 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(三)条件装配
如果一个标注了@Configuration的配置类被标注为@Profile,那么与该类关联的所有@Bean方法和@Import}注释将被绕过,除非一个或多个指定的配置文件处于活动状态。如果一个@Configuration配置类标注了@Conditional,那么与之相关联的@Bean方法,@Import导入,@ComponentScan注解都将适用于这些条件。简单概括,Profile提供了一种“基于环境的配置”,根据当前项目的不同运行时环境,可以动态地注册与当前运行环境匹配的组件。原创 2024-03-06 17:00:19 · 512 阅读 · 0 评论 -
SpringBoot源码解读与原理分析(二)组件装配
为什么导入WebMvc场景启动器后,即使没有编写任何配置代码,应用也可以正常启动?Spring Boot 如何确定引入的技术场景中需要哪些重要组件?为什么项目在没有配置任何Web容器的情况下也可以正常启动Web服务?@Retention(RetentionPolicy.RUNTIME) //该注解在运行时起效@Target(ElementType.TYPE) // 该注解只能标注到类上。原创 2024-03-09 11:10:26 · 1020 阅读 · 0 评论