- 博客(68)
- 资源 (8)
- 收藏
- 关注

原创 【Spring 源码阅读】Spring IoC、AOP 原理小总结
Spring IoC、AOP 原理小总结前言版本约定正文Spring BeanFactory 容器初始化过程IoC 的过程AOP 的过程AnnotationAwareAspectJAutoProxyCreatorAOP 代理的创建过程Advice 执行的过程小结系列博文:【老王读Spring AOP-0】SpringAop引入&&AOP概念、术语介绍【老王读Spring AOP-1】Pointcut如何匹配到 join point【老王读Spring AOP-2】如何为 Pointc
2021-12-03 19:39:06
1257

原创 【老王读 Spring 源码】系列文章大合集
【老王读 Spring 源码】系列文章大合集前言版本约定正文Spring IoC 源码解读系列博文Spring AOP 源码解读系列博文小结前言分享 Spring 源码的理解,底层原理和设计实现。这里会整理所有关于【老王读 Spring 源码】的系列文章链接,方便寻找。温馨的传送门。。。这里会定期更新【老王读 Spring 源码】系列文章的链接,保持最新。。。版本约定Spring 5.3.9 (通过 SpringBoot 2.5.3 间接引入的依赖)正文Spring IoC 源码解读系列博
2021-11-11 20:26:14
889
1
原创 【老王最佳实践-6】Spring 如何给静态变量注入值
有些时候,我们可能需要给静态变量注入 spring bean,尝试过使用 @Autowired 给静态变量做注入的同学应该都能发现注入是失败的。
2024-05-22 12:42:26
392
原创 【老王最佳实践-5】spring 多线程池的配置及使用&利用FactoryBean做参数配置化技巧
在 Spring 中使用异步线程池时非常方便的,只需要在被执行的方法上加上@Async就行。开启 Spring 异步需要添加配置 @EnableAsync但是,有时我们可能需要多个异步线程池,最好每个线程池都是可配置的。多个线程池给不同的业务场景来使用,防止线程池卡死,或者任务堆积影响到其他业务。
2024-05-21 19:43:07
470
原创 【老王最佳实践-4】一招解决bean的优先加载问题
有时,我们会碰到一个 bean 在使用时,却没有被 spring 容器加载。例如下面的 PropertiesHelper 类,我们在另一个类 FooService 中使用了静态方法来获取配置值,却报了空指针。碰到这种问题,通常的做法就是在 FooService 加载前,让 PropertiesHelper 优先加载,比如使用 @DependOn 或者 在 FooService 中 @Autowired 自动注入 PropertiesHelper。
2024-05-21 12:47:29
445
原创 【老王最佳实践-3】展示逻辑与业务逻辑分离解耦
需求开发过程中,我们可能经常会碰到需要将 db 中查出的数据做单位转换,比如:db 中存的是分,页面需要展示为元;有时,又需要做类型映射,比如:db中存的 type=1 表示人民币,type=2 表示美元,前端需要展示汉字。如果你将这些展示层的逻辑放在业务代码里面来做,那么真正核心的业务逻辑代码将淹没在一堆代码里面,不易维护。怎么样可以更加优雅的处理这些与核心业务不太相关的逻辑呢?
2024-05-16 20:28:38
347
原创 【老王最佳实践-2】SpringBoot 多种类型配置同时使用出奇效
所有用到 SpringBoot 的同学都知道,SpringBoot 是同时支持 yml 和 properties 格式的配置的。比如,在项目中,我们可以使用 application.yml 或者 application.properties 文件来编写配置。大部分人都以为 SpringBoot 的文件配置是 二选一,要么使用 application.yml ,要么使用 application.properties。
2024-05-16 20:15:02
375
原创 【老王最佳实践-1】将第三方类纳入 Spring 管理,做成可配置化
有些时候,我们需要将一些第三方库中的配置类纳入到 spring 的管理,比如:配置线程池参数,怎么做比较优雅呢?如果是 spring xml 的话,我们可能使用 spring 的属性注入来进行配置。在 springboot 中,可以怎样优雅的进行配置呢?
2024-05-16 20:10:29
178
原创 【SpringMVC源码三千问】Spring官方@RequestMapping路径匹配用法大全
先看下@Target({/*************限制匹配范围的参数******************/ // 请求方法限定 RequestMethod [ ] method() default {// 请求参数限定 String [ ] params() default {// 请求头限定 String [ ] headers() default {// 接收的 Content-Type 内容类型限定 String [ ] consumes() default {
2023-05-24 19:49:42
2230
原创 【SpringMVC源码三千问】@RequstMapping和RequestCondition
是 SpringMVC 中最常用的定义请求映射关系的注解。下面我们来分析一下它的源码。
2023-05-24 19:45:46
1271
原创 【老王读SpringMVC-7】Controller method 的异常返回值处理
通过前面分析,我们知道, handler method 的执行是通过调用。执行过程中的异常全部会往上抛出,然后由来处理。DispatcherServlet 会调用 HandlerExceptionResolver 来对异常进行处理。可以看到,如果 handler method 执行过程中出现异常的话,会调用来处理,接着会通过来处理异常,最终解析成一个 ModelAndView 来进行处理。
2023-05-24 19:37:16
1331
原创 【老王读SpringMVC-6】Controller method 的正常返回值处理
handler method 的返回值处理包含两个方面:一是:返回值对象的处理;二是:视图的渲染。
2023-05-24 19:31:32
1020
原创 【老王读SpringMVC-5】Controller method 是如何执行的?
通过前面对 Controller method 参数绑定的分析,我们知道, 被 @RequestMapping 标记 handler method 的执行是通过调用 。 具体的调用过程如下:参数解析、handler method 的执行 和 对返回值的处理,最终是通过 来处理的。 的处理过程如下:1、首先,通过 解析出方法执行所需要的参数,然后通过反射调用 handler method 来执行。2、如果 handler method 的返回值为空,则看是否跳过返回值处理和视图解析,直接返回3、
2023-05-24 19:25:00
576
原创 【老王读SpringMVC-4】请求参数是如何绑定到Controller method参数对象上的?
上一篇我们分析了,接下来,我们再看分析一下请求参数是如何绑定到 handler method 的参数对象上的?
2023-04-27 12:32:39
506
原创 【老王读SpringMVC-3】根据 url 是如何找到 controller method 的?
前面分析了 request 与 handler method 映射关系的注册,现在再来分析一下 SpringMVC 是如何根据 request 来获取对应的 handler method 的?可能有人会说,既然已经将 request 与 handler method 映射关系注册保存在了中,那么根据 request 不就能直接从 registry 中获取到相应的 handler method 了吗?
2023-04-26 12:35:20
722
原创 【老王读SpringMVC-2】url 与 controller method 的映射关系注册
断点打在 bean class 的构造函数或初始化方法里面,当断点进入时,可以很方便的从调用堆栈中找到相应的 BeanDefinition 的值,BeanDefinition 中就记录了这个 bean 是从在哪里定义的。如果断点打不到 bean class 里面的话,那么就可以在 applicationContext 中获取相应的 BeanDefinition,再查看 bean 定义的地方。
2023-04-25 21:13:17
675
原创 【SpringMVC源码三千问】DispatcherServlet源码解析
是 SpringMVC 处理请求分发的方法,只要是 spring mvc 处理的 http 请求,都会经过 DispatcherServlet 的请求分发处理,从而调用相应的 handler method。
2023-04-25 20:54:44
602
原创 【老王读SpringMVC-1】SpringMvc源码解读引入
在研究 SpringMVC 之前,我们先来了解一下什么是 MVC?MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,它把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。参考: https://zh.m.wikipedia.org/zh-hans/MVC。
2023-04-07 10:47:58
403
原创 【Spring事物三千问】DataSource的设计和常用实现——Hikari、Druid
AbstractRoutingDataSource 是 Spring 对 DataSource 的抽象实现。它是一个基于 lookup key ,将的调用路由到目标数据源的抽象数据源实现。通常都是通过 ThreadLocal 绑定的事务上下文变量来确定路由到哪个目标数据源。是 AbstractRoutingDataSource 的实现类,它是一个能基于当前事务隔离级别路由到目标数据源的 DataSource 数据源。
2023-03-22 11:35:11
1177
原创 【Spring事物三千问】Spring配置多数据源 vs 给多个数据源添加事物管理
在 Spring 中配置多数据源 与 给多个数据源添加事物管理是有区别的。如果只需要使用到多个数据源,而不需要进行事物管理,是可以进行简单处理的。
2023-03-21 10:27:54
388
原创 【Spring事物三千问】TransactionSynchronizationManager的原理分析
TransactionSynchronizationManager 是管理每个线程的DB连接资源和事务同步的核心委托类。如果事务同步未处于活动状态,则表示当前没有事务,或者事务管理器不支持事务同步。TransactionSynchronizationManager 中定义了很多 ThreadLocal 变量,来保存事务相关的信息不同的平台的DB连接资源对象可能是不一样的,反映在 Spring 源码当中就是调用方法时,绑定的 DB 连接资源不同。
2023-03-14 20:34:02
2126
原创 【Spring 源码三千问】同样是AOP代理bean,为什么@Async标记的bean循环依赖时会报错?
前面在分析那么,为什么同样是 AOP 代理 bean,差别就这么大呢?
2023-03-08 18:56:49
269
原创 【Spring事物三千问】DataSource的设计和常用实现——Hikari、Druid
AbstractRoutingDataSource 是 Spring 对 DataSource 的抽象实现。它是一个基于 lookup key ,将的调用路由到目标数据源的抽象数据源实现。通常都是通过 ThreadLocal 绑定的事务上下文变量来确定路由到哪个目标数据源。是 AbstractRoutingDataSource 的实现类,它是一个能基于当前事务隔离级别路由到目标数据源的 DataSource 数据源。
2023-03-08 12:36:13
2493
原创 【老王读Spring Transaction-7】一个数据源的事物管理配置 与 多数据源的事物管理配置
大多数 Spring 应用程序只有一个数据源,只需要一个事务管理器(TransactionManager)。但是在多个数据源的情况下,我们就需要在一个应用程序中配置多个独立的事务管理器。我们可以通过 @Transactional 的 value 或 transactionManager 属性来指定让哪个 TransactionManager 生效。那么,一个数据源 与 多数据源的事物管理配置有什么不同呢?
2023-03-03 12:49:39
1459
1
原创 【Spring事物三千问】Spring的事务管理与MyBatis事物管理结合的原理
spring-tx 是一套事务管理框架。Mybatis 是一个 ORM 框架,它会操作 DB 连接来执行 sql,所以,也会涉及到事务的处理。在 MyBatis 中,是通过 SqlSession 来执行 sql 的,也是通过它来管理事务的。默认情况下,MyBatis 是开启事务的,即:那么,spring-tx 的事务管理是如何与 mybatis 的事务管理进行整合的呢?
2023-02-28 12:50:08
1799
原创 【Spring事物三千问】如何快速判断Spring项目中的事务是否生效?
如果 Spring 的事务没有生效,很有可能导致严重的生产问题,自己的能力也会受到组员和领导的质疑。那么,刚接手一个新项目,或者搭建了一个新项目,如何快速的判断我们的事务配置是否生效?
2023-02-27 10:05:54
1801
原创 【老王读Spring Transaction-6】spring-tx与DataSource连接池整合的原理
是 java 提供的一个获取 DB 连接的标准接口。它的实现类可以通过简单的实现,生成标准的连接对象;也可以使用连接池方式实现,生成的池化的连接对象。通常在企业级的开发当中,我们都会使用池化的连接对象,比如使用 apache 的 DBCP 连接池、阿里的 druid 连接池、springboot 默认使用的 hikari 连接池等那么,DataSource 是如何与 spring-tx 进行结合的呢?spring-tx 的核心关注点是事务的管理。连接的获取和关闭是交给连接池去实现的。
2023-02-17 09:20:09
687
1
原创 【老王读Spring Transaction-5】Spring事务传播行为propagation behavior的实现原理
Spring 对事务的封装除了实现了基本的事务管理之外,还提供了事务传播行为(propagation behavior)的高级特性。通常,事务范围内的所有代码都会在该事务中运行。但是,如果在事务上下文已经存在的情况下再去执行其他事务方法,则可以指定事务的传播行为。例如,代码可以在现有事务中继续运行(常见情况),或者可以暂停现有事务并创建新事务。事务传播行为的作用是将多个事务操作进行合并或者隔离。
2023-02-15 12:48:24
507
原创 【老王读Spring Transaction-4】Spring事务管理的核心原理——PlatformTransactionManager&TransactionStatus
begin: 获取连接commit: 提交事务(业务正常执行)rollback: 回滚事务(业务异常)Spring 中通过注解的方式实现了切面式的事务管理,其本质还是会经历上面三个步骤。下面我们就来研究一下 Spring 中是怎么实现事务的管理的。
2023-02-10 12:59:39
2600
原创 【老王读Spring Transaction-3】TransactionDefinition原理和源码解析
前文在分析@Transactional是如何被解析的时候讲到,@Transactional 配置的事务属性被解析出来之后,被放在了当中。是 Spring 中用来定义事务属性的接口,它继承自。下面就来详细分析一下的作用。
2023-02-08 10:14:32
905
原创 【老王读Spring Transaction-2】@Transactional是如何被 Spring 解析的?
前面透过讲解了实现事注解事务功能的原理。这一篇主要分析一下的注解元数据信息是如何被扫描和解析出来的。@EnableTransactionManagement 的详细知识可以点击:从EnableTransactionManagement顺藤摸瓜,研究@Transactional的实现原理。............
2022-09-01 13:03:15
539
1
原创 【老王读Spring Transaction-1】从EnableTransactionManagement顺藤摸瓜,研究@Transactional的实现原理
Spring 对事务的封装是一个相对独立的功能,通过来进行支持。里面的代码量也不大,我们完全可以像翻书的目录一样,浏览一下 spring-tx 的包结构和类,站在一个高的角度来审视一下 Spring 对事务的封装。.........
2022-08-31 14:43:34
613
原创 【Spring源码三千问】@Lazy的替代者ObjectFactory 和 ObjectProvider
Lazy 可以解决某些特殊场景下的循环依赖问题。在翻阅 @Lazy 的源码注释时,得知 @Lazy 可以通过 ObjectFactory 和 ObjectProvider 来进行替代。下面我们就来看看ObjectFactory 和 ObjectProvider的原理和使用吧…@Lazy为什么可以解决特殊的循环依赖问题@Lazy延迟加载与延迟注入有什么区别。...
2022-08-08 19:58:03
679
原创 【Spring源码三千问】ApplicationContext 与 BeanFactory 的作用是什么?它们有什么区别?
ApplicationContext 与 BeanFactory 的作用是什么?它们有什么区别?前言版本约定正文BeanFactoryHierarchycalBeanFactoryDefaultListableBeanFactoryApplicationContextApplicationContext vs BeanFactory小结SpringIoC源码视频讲解:前言我们在讲 Spring 容器器,通常指的是 Spring IoC 容器。跟 Spring IoC 容器相关的类、接口有 BeanFa
2022-02-23 11:11:33
728
原创 正则表达式高级用法: 分组
正则表达式高级用法: 分组分组的使用场景分组的使用方法捕获组分组的使用实例javascript 获取分组内容java 获取分组内容小结分组的使用场景在书写正则表达式时,通常情况下,我们有两种场景会使用到分组。一是:对一个子表达式进行重复;二是:想要获取到子表达式匹配到的内容。对子表达式进行重复如果需要重复单个字符,直接在字符后面加上限定符即可,例如 a+ 表示匹配1个或一个以上的a,a?表示匹配0个或1个a。但是我们如果要对多个字符进行重复的话,就需要用到 分组 。比如:(ab){3} 表
2022-02-13 09:39:29
10992
3
原创 正则表达式中的勉强和侵占模式的对比分析
前言前文分析过,正则中有三种模式: 贪婪、勉强、侵占。勉强模式其实比较好理解,就是尽量少的去匹配字符。贪婪和侵占模式有一些相似,但又有很大的不同,下面我们就通过实例来分析一下两者的区别。关于 贪婪、勉强、侵占 模式的对比,请点击:正则表达式中的贪婪、勉强、侵占模式到底是什么意思?正文我们再来回顾一下贪婪模式和侵占模式:贪婪模式是在表达式中单独使用正则量词 ? 、* 、+ 、{n,m} 的情况。它的特点是一次尽量多的匹配字符,但可以回退。侵占模式也叫占用模式,是在贪婪模
2022-02-13 09:36:26
316
原创 正则表达式中的贪婪、勉强、侵占模式到底是什么意思?如何进行使用?
正则表达式中的贪婪、勉强、侵占模式到底是什么意思?如何进行使用?前言正文贪婪、勉强、侵占模式对比通过实例分析贪婪、勉强、侵占贪婪模式勉强模式侵占模式小结前言不管是什么语言,基本都会用到正则表达式,可以说正则表达式是一个程序员必需要掌握的一项技能。而正则里面的难点要数 贪婪、勉强、侵占 三种模式最难理解了。接下来,就带着大家一起来分析一下 贪婪、勉强、侵占 到底是什么鬼?正文使用过正则的同学可能都知道,在正则表达式中 ? 、* 、+ 、{n,m} 等表示是贪婪模式,它们在正则里面称作量词。下面
2022-02-13 09:32:23
1021
原创 【Spring源码三千问】@Lazy延迟加载与延迟注入有什么区别?
@Lazy延迟加载与延迟注入有什么区别?@Lazy 标记在 @Autowired/@Resource 注入的属性上,或者对应的 bean 类上,都可以解决循环依赖报错的问题。 那么,不同的使用方式有什么区别呢?会带来什么样不同的效果呢?
2022-01-03 14:39:26
3079
1
原创 【Spring 源码三千问】同样是AOP代理bean,为什么@Async标记的bean循环依赖时会报错?SmartInstantiationAwareBeanPostProcessor解析
同样是AOP代理bean,为什么@Async标记的bean不能被循环依赖?前言版本约定正文SmartInstantiationAwareBeanPostProcessor非 SmartInstantiationAwareBeanPostProcessor 生产代理的情况小结【老王读Spring AOP-0】SpringAop引入&&AOP概念、术语介绍【老王读Spring AOP-1】Pointcut如何匹配到 join point【老王读Spring AOP-2】如何为 Pointc
2021-12-29 19:45:34
783
原创 【Spring源码三千问】Spring AOP 中 AbstractAdvisorAutoProxyCreator、AbstractAdvisingBeanPostProcessor的区别
产生AOP代理类的两种BeanPostProcessor对比: AbstractAdvisorAutoProxyCreator vs AbstractAdvisingBeanPostProcessor 前言版本约定正文AutoProxyCreator: AbstractAdvisorAutoProxyCreatorAbstractAdvisingBeanPostProcessorAbstractAdvisorAutoProxyCreator 与 AbstractAdvisingBeanPostProces
2021-11-30 11:30:46
875
老王读spring-ioc源码分析&测试代码.zip
2021-11-19
老王读spring-aop源码分析&测试代码.zip
2021-11-11
Photoshop学习笔记《入门到高手的经典总结》
2013-04-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人