
spring源码
文章平均质量分 72
spring源码学习笔记
小小少年_
这个作者很懒,什么都没留下…
展开
-
AopContext对象原理
AopContext的是使用和原理原创 2022-06-26 17:20:52 · 819 阅读 · 0 评论 -
spring注入list集合
spring可以帮助我们自动的完成bean属性的注入,其中有一个比较特殊的,就是list集合spring中,在使用@Autowired注解注入list集合的时候,并不会根据注入属性值的类型去容器中查找,而是根据list集合的元素类型,从spring容器中找到所有的实现类,放在list集合中,然后注入到bean中...原创 2022-05-15 09:01:56 · 10716 阅读 · 0 评论 -
spring aop和事务同时开启带来的一些问题
最近自己在写一个aop切面,主要是用来记录日志和打印一些信息的,在测试过程中,发现,业务方法在加了事务之后,如果有其他异常抛出,事务并没有回滚,于是,就Google了一把,发现有大佬遇到过这个问题,大部分博客给到的答案是:因为切面的优先级低于事务的优先级,导致事务advisor生成的代理对象被,切面生成的代理对象给覆盖了,需要在切面上加上@Order(1)注解,这样可以保证,切面的优先级较高我自己忽然间想到之前,遇到过类似的问题,并且也记录到了线上问题模块,按照实际操作之后,确实:在切面上加了@Order原创 2022-01-05 20:30:32 · 1850 阅读 · 0 评论 -
spring多个事务管理器踩坑
项目中使用了两个事务管理器,但是没有手动指定事务要使用哪个,导致事务不生效原创 2021-11-07 18:20:09 · 2777 阅读 · 0 评论 -
spring事务之事务挂起和事务恢复源码
在学习spring事务的时候,一定会涉及到一个概念,无法避免的,就是事务挂起,所谓的挂起,就是将事务中的属性暂时存储到一个类中原创 2021-09-25 20:38:56 · 3299 阅读 · 0 评论 -
spring事件监听器系列三:通过ApplicationListener接口方式实现监听器源码
前面有介绍了@EventListener注解方式的源码,这篇笔记主要来记录通过实现ApplicationListener接口这种方式实现事件监听器的原理具体的流程,前面博客中,有插入一个截图,我们这篇博客中,主要介绍解析的细节,具体的流程,就不在这里叙述,在上一篇博客中有记录整个流程解析ApplicationListener实现类源码org.springframework.context.support.ApplicationListenerDetector#postProcessAfterIniti原创 2021-08-01 16:17:34 · 616 阅读 · 0 评论 -
spring事件监听器系列二:@EventListener注解原理
前面的笔记中,有写过,我们要在spring中声明一个事件监听器,有两种方式,一种是实现ApplicationListener接口,一种是通过@EventListener注解来修饰一个方法,并在该注解中,指定要监听的事件,那这个方法在事件发生的时候,会被回调这两种机制,其实我们先不看代码,去考虑下,实现的方式很有可能就是:对于实现接口这种方式,是ApplicationListenerDetector这个类来完成解析的对于注解这种方式,是EventListenerMethodProcessor和Defau原创 2021-08-01 16:10:33 · 4437 阅读 · 1 评论 -
spring事件监听器系列一:应用
123原创 2021-07-26 21:05:06 · 766 阅读 · 0 评论 -
spring扩展点四:SmartInitializingSingleton 补充
前面有笔记,记录过SmartInitializingSingleton这个扩展点的使用,可以参考这篇博客 spring扩展点四:SmartInitializingSingleton的应用这篇博客是我自己写的一个demo,要验证这个扩展机制,但是最近在看spring事件监听机制的时候,看到了对这个扩展点的应用EventListenerMethodProcessor ,就是这个bean,我们先不说这个bean是什么注入到spring容器中的,会在后面事件监听器源码的博客中,单独记录,这篇博客主要想说明的原创 2021-07-18 12:44:23 · 510 阅读 · 1 评论 -
spring容器中存储的bean相关问题
通常我们说,spring容器帮我们管理bean,但是什么是bean?原创 2021-04-25 21:04:16 · 627 阅读 · 0 评论 -
spring容器是什么
spring容器是什么原创 2021-04-19 12:06:11 · 2246 阅读 · 0 评论 -
spring事务失效场景三:内部方法调用
这篇笔记主要记录spring事务失效场景三:在同一个类中,用非事务方法调用事务方法首先,这种场景,失效的原因是,在非事务方法中,调用同一个类的事务方法,和动态代理没有关系,事务拦截器无法拦截到,就是一个this方法调用,所以,在实际业务开发过程中,一定要避免这种场景应用应用其实简单...原创 2021-04-15 20:14:07 · 1181 阅读 · 0 评论 -
spring事务失效二:业务代码捕获异常
trycatch 捕获异常原创 2021-04-12 08:54:02 · 439 阅读 · 1 评论 -
spring的beanDefinition是什么
在spring源码中,会涉及到bean和beanDefinition这两个概念,接下来,说下什么是bean,什么是beanDefinition原创 2021-04-07 08:13:01 · 3486 阅读 · 0 评论 -
spring事务失效一:非public方法
在使用spring事务的时候,如果使用不当,有可能会出现事务失效的问题,接下来,我基于自己的见解和学习,分享下我的看法对于非public方法这种场景,我觉得这是最好理解的一种场景,@Transactional注解加在非public修饰的方法上,就不会生效,这个是没问题的,接下来,我分析下为什么非public方法会失效,其实在这篇博客中已经介绍了一部分:spring事务源码-代理对象生成过程解析spring事务也是通过动态代理来实现的,spring事务也是借鉴了AOP的思想,在对一个bean进行初始化的原创 2021-04-02 08:12:51 · 3357 阅读 · 1 评论 -
spring扩展点六:监听spring容器刷新事件
在spring初始化的流程中,会发送一个容器刷新事件原创 2021-03-31 19:27:42 · 837 阅读 · 0 评论 -
spring扩展点五:factoryBean的使用
factoryBean是spring中提供的一个扩展点原创 2021-03-30 08:16:15 · 412 阅读 · 0 评论 -
spring扩展点四:SmartInitializingSingleton的应用
前言在这篇笔记中,主要记录SmartInitializingSingleton这个扩展点的应用,这个接口是在spring将所有的bean放入到spring容器之后,提供的一个扩展机制,在常用的框架中,我看到springcloud在将zk作为注册中心的时候,有用到这个扩展点org.springframework.cloud.zookeeper.serviceregistry.ZookeeperServiceRegistry目前还没有搞懂这个扩展点可以用来做什么,只是先记录一下原理和如何扩展,后续如果原创 2021-03-27 15:54:55 · 904 阅读 · 0 评论 -
spring扩展点三:@Import注解
说到@Import注解,必须要说的是下面这两个类ImportSelector接口对应的实现方法中,需要返回一个数组,数组中,是要注入到spring容器中的class对应的全类名ImportBeanDefinitionRegistrar接口的实现方法中,会提供BeanDefinitionRegistry对象,我们可以在方法中通过该对象自己注入到beanDefinitionMap中一个beanDefinition对象这是这两个类的作用在spring源码中,@Import注解是使用最多的,一点也不为过,其原创 2021-03-26 21:29:16 · 211 阅读 · 0 评论 -
mergeBeanDefinition原理
mergeBeanDefinition原创 2021-03-25 08:16:39 · 680 阅读 · 0 评论 -
spring扩展点二:自定义beanPostProcessor原理解析
beanPostProcessor是我在学习spring源码中,目前看到扩展最多的一个接口,比如:aop、spring事务、初始化方法回调,都是对该接口的扩展和实现,除了spring本身的框架,比如dubbo的ReferenceAnnotationBeanPostProcessor,这个扩展类就是一个后置处理器,用来解析@Reference注解的bean后置处理器呢,spring在初始化bean的流程中,已经定义好了先执行后置处理器的哪个方法,后执行哪个方法,所以,我们在扩展的时候,要熟知这些方法执行位置原创 2021-03-22 20:52:58 · 1916 阅读 · 0 评论 -
spring扩展点一:BeanDefinitionRegistryPostProcessor在框架中的应用
上篇笔记主要记录了BeanDefinitionRegistryPostProcessor扩展机制的实现原理,这篇笔记注意记录下,自己在学习源码的过程中,看到的该扩展机制使用的地方其实我上篇笔记有说过,这个扩展机制,太靠前,如果我们通过@Component注解去注入到spring容器中,那我们自定义的实现类是在所有的业务bean还没有放到spring容器中的时候,就执行了,此时一般也很少有业务需求是在这个时候对beanDefinition进行一些修改,但是,在底层框架中,有可能会用到这个扩展点,我看到的是m原创 2021-03-20 16:07:30 · 476 阅读 · 1 评论 -
spring扩展点一:BeanDefinitionRegistryPostProcessor
spring提供了一系列的扩展点原创 2021-03-20 10:08:08 · 530 阅读 · 0 评论 -
SpringAop源码一:通知方法优先级
AOP的源码我计划分为四部分来学习通知方法优先级源码切面执行先后顺序优先级判断哪些方法需要生成代理对象 + 动态代理对象的生成通知方法的执行(拦截器的拦截)在aop中,众所周知,通知方法的优先级是:Around > Before > After > AfterReturning > AfterThrowing:这篇笔记注意记录为什么优先级是这样子的,原理是 什么样的...原创 2021-03-07 18:04:48 · 352 阅读 · 0 评论 -
spring事务传播机制源码学习笔记
传播机制源码原创 2021-02-11 09:22:48 · 256 阅读 · 0 评论 -
spring源码-第七个后置处理器的使用
初始化方法的处理这个笔记中,记录的就是第七个后置处理器的使用,这篇笔记就简单做一个总结吧在spring源码中,提供了三种初始化方法,spring也指定了三种初始化方法的优先级:@PostConstruct > InitializingBean接口 > init-method在初始化方法被调用的时候,只有@PostConstruct是在第七个后置处理器被调用的,其实逻辑和@Autowired的思想是一样的,先找到加了注解的方法,然后执行...原创 2021-01-03 12:24:21 · 181 阅读 · 0 评论 -
spring源码-第五个后置处理器笔记
在手动注入源码这篇博客中,记录的是手动注入的源码,但是实际上就是第六个后置处理器的使用;所以这篇博客就主要记录第五个后置处理器的学习;第五个后置处理器,实际上在手动注入的时候,是和第六个后置处理器一起配合使用的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean第五个和第六个后置处理器都是在这个方法中完成调用的,第五个后置处理器是来判断是否需要进行属性注入的,这里也算是一个扩原创 2020-12-27 18:01:43 · 216 阅读 · 2 评论 -
spring源码-第四个后置处理器
这是第四个后置处理器的源码学习笔记原创 2020-12-27 11:02:06 · 173 阅读 · 2 评论 -
spring源码-第三个后置处理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean在spring源码中,这个方法中,完成了第二个到第八个后置处理器的调用,前面的推断构造函数的笔记中,记录了对第二个后置处理器的调用,这篇笔记,主要记录第三个后置处理器的使用源码synchronized (mbd.postProcessingLock) { if (!mbd.postProcessed) { try {原创 2020-12-23 08:07:52 · 227 阅读 · 1 评论 -
spring源码 第二个后置处理器方法的使用-推断构造函数
spring一个bean初始化以及销毁的流程中,有九个后置处理器需要执行,这篇博客主要记录第二个后置处理器推断构造函数的后置处理器的源码逻辑第一个后置处理器的调用在第一个后置处理器被调用之前,会进行一系列的判断会先调用第一个后置处理器,判断是否返回了bean,如果返回了bean,且不为null,就直接调用第八个后置处理器,完成bean的代理,然后return了之后,就结束了一个bean的生命周期,也即:一个bean就初始化完成了第一个后置处理器是:org.springframework.beans.原创 2020-12-20 14:36:17 · 531 阅读 · 0 评论 -
spring源码-自动注入
在前面的博客中,介绍了@Autowired和@Resource注解的原理,这两种方式,我们认为是手动注入,这是spring默认的注入方式,如果我们要使用自动注入,需要设置自动注入模式autowireMode应用@Componentpublic class UserBean { private IndexBean indexBean; public UserBean(IndexBean indexBean) { System.out.println("userBean原创 2020-11-21 10:35:38 · 370 阅读 · 0 评论 -
spring源码-@Autowired、@Resource注解底层原理
上篇博客说了自动注入模型的使用,这篇笔记打算记录下自动注入模型中,autowireMode为0的情况,也就是我们经常用到的@Autowired、@Resource注解的原理原创 2020-10-24 15:11:44 · 1716 阅读 · 0 评论 -
spring自动注入模型
spring的注入,可以分为两种,分别是手动注入和自动注入我们这里要记录的是自动注入自动注入模型spring的自动注入模型有四种,分别是:autowire_no(0): 默认的装配模式,如果注入indexBean,没有在属性上加@Autowired或者@Resource,这时候,indexBean是无法注入的autowire_name(1): 通过set方法,并且set方法的名称必须和bean的name名称一致, byNameautowire_type(2): 通过set方法,这种方式set方原创 2020-10-21 22:17:28 · 611 阅读 · 0 评论 -
spring事务源码执行过程分析
上篇博客解析了事务生成动态代理对象的底层代码,简单总结的话就是一句话:如果添加了事务注解@Transactional,且方法是public的,spring就会给该bean生成代理对象,至于是jdk还是cglib,就看自己的事务方法对应的类是否实现了接口拦截器执行org.springframework.transaction.interceptor.TransactionInterceptor我在学习的时候,用的是cglib代理,因为我没有实现接口,所以使用的是CGLIB代理,在目标方法被调用的的时原创 2020-09-20 16:59:35 · 260 阅读 · 0 评论 -
spring事务源码-代理对象生成过程解析
spring事务源码spring事务的源码,要从@EnableTransactionManagement注解拉开序幕首先,如果我们要使用spring事务,只需要在配置类上添加@EnableTransactionManagement注解,并且在业务方法上添加@Transactional注解即可(以spring项目为例,SpringBoot项目后面博客中再另说)@EnableTransactionManagement@Target({ElementType.TYPE})@Retention(Reten原创 2020-09-20 16:49:37 · 2060 阅读 · 0 评论 -
spring实例化前的准备操作
spring初始化的前置操作spring真正开始实例化之前,会有一些操作,该笔记,主要来记录真正调用后置处理器之前的处理逻辑spring的实例化,是通过调用一系列的后置处理器来完成前面有说到过,spring对bean的操作,是在refresh方法中完成的,finishBeanFactoryInitialization是对beanDefinitionMap集合中的bean进行实例化的org.springframework.context.support.AbstractApplicationConte原创 2020-08-23 09:46:09 · 491 阅读 · 0 评论 -
spring源码:注册后置处理器
目的程序员在对spring扩展的时候,可以自己实现后置处理器,完成特定的业务操作,该篇博客,主要是学习spring如何将程序员提供的后置处理器添加到spring容器中的;顺带,将spring初始化流程中,其他几个方法做一个大致的解析和介绍源码学习registerBeanPostProcessors(beanFactory);该方法是用来完成,注册BeanPostProcessor实现类的如果我们自己实现了BeanPostProcessor接口,并提供了自己的业务处理逻辑,spring首先会把我们原创 2020-07-24 08:44:17 · 444 阅读 · 0 评论 -
spring扫描bean总结
目的从扫描bean的原理 到 @Configuration源码这之间的几篇关于spring源码的博客,都是围绕着一个方法来解析的invokeBeanFactoryPostProcessors(beanFactory);org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors所以,打算在这篇博客中,对这个方法做一个小总结在进入到该方法的时候,首先会执行程序员通过a原创 2020-07-12 17:08:28 · 731 阅读 · 0 评论 -
spring源码:@Configuration源码
@Configuration注解在使用spring的时候,如果我们加了一个配置类,通常会在配置类上加上一个@Configuration注解,这个注解的作用,是我们要探讨的内容结论:1.加了@Configuration注解的类,我们称之为全配置类,这里之所以这么叫,在后面我会解释(当然)2.对于加了@Configuration的配置类,spring会为该类生成代理对象(CGLIB代理)3.配置类加与不加@Configuration,都会注入bean,只是,通过@Bean在配置类中注入的bean,有可原创 2020-06-23 19:26:19 · 598 阅读 · 0 评论 -
spring源码:@Import注解
目的前面的文章@Bean源码解析有说到,将一个bean,转换成BeanDefinition,并存入BeanDefinitionMap有三种方式;本文,我们要说的是@Import注解这种方式;@Import是用来引入bean的;和本文相关的,我们需要关注ImportSelector和ImportBeanDefinitionRegistrar接口说明ImportBeanDefinitionRegistrar该接口,定义了一个public void registerBeanDefinitions(Ann原创 2020-06-18 08:44:55 · 326 阅读 · 0 评论