
Spring源码
文章平均质量分 88
埃泽漫笔
OceanBase开源项目ODC(OceanBase Developer Center)的核心贡献者,Github地址:https://github.com/oceanbase/odc,希望大家能赏脸支持下我们OceanBase公司的开源项目,点亮一颗小星星就行。
Maven中央仓库OceanBase开源组件 https://central.sonatype.com/artifact/com.oceanbase/db-browser 和 https://central.sonatype.com/artifact/com.oceanbase/ob-sql-parser 的核心贡献者。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring源码分析-事务源码分析
然后我们在上面的中看到了这个对象,通过字面含义是事务定义。我们来看看结构。也就是中定义了事务的传播属性和隔离级别,然后来看看具体的体系结构DefaultTransactionDefinition:是事务定义的默认实现DefaultTransactionAttribute:扩展了TransactionAttribute中的属性的实现@Transactional:该组件就会被解析加载为对应的对象。原创 2025-05-08 21:12:02 · 866 阅读 · 0 评论 -
Spring源码-AOP分析
本文我们开始讲解Spring中的AOP原理和源码,我们前面手写了AOP的实现,了解和自己实现AOP应该要具备的内容,我们先回顾下,这对我们理解Spring的AOP是非常有帮助的。在上面的分析中出现了很多代理相关的代码,为了更好的理解,我们来梳理下Spring中的代理相关的结构。我们先来看看Advice的类结构,advice--》通知,需要增强的功能。回顾了前面的内容,然后我们来看看Spring中AOP是如何来实现的了。然后我们需要关注的方法 根据对应的方法获取对应的Advisor 通知。原创 2025-05-07 22:58:33 · 1245 阅读 · 0 评论 -
Spring源码-Bean的实例化
因为Bean对象的实例化肯定是BeanFactory基于对应的BeanDefinition的定义来实现的,所以在这个过程中BeanDefinition是非常重要的,前面的课程讲解已经完成了BeanDefinition的定义。而具体创建单例Bean的逻辑会回调前面的Lambda表达式中的createBean方法。这个就是Bean实例化的过程了,当然在实例化中的DI问题我们在下篇文章中重点分析。在创建单例对象的时候是如何保存单例的特性的?然后我们在测试的案例中显示的调用。对应的在web项目中就有对应的调用。原创 2025-05-07 22:47:12 · 401 阅读 · 0 评论 -
Spring源码-DI的过程
接下来我们看看在构造注入的情况下。对循环依赖的检测是怎么做的。前面我们分析过,在构造注入的情况下,对于循环依赖是没有办法解决的。接下来我们分析下Spring源码中Bean初始化过程中的DI过程。在Spring中生成Bean实例的时候默认是调用对应的无参构造方法来处理。而且我们可以发现在原型对象的检测中使用的是ThreadLocal来存储了。然后我们来看看Bean的属性依赖的处理。当然上面的针对单例的处理,如果是原型的话。然后我们来看看他是如何实现循环检测的。然后来看看是如何处理循环依赖的。原创 2025-05-06 23:48:28 · 362 阅读 · 0 评论 -
AbstractApplicationContext#refresh方法
核心是会完成注册的BeanFactoryPostProcessor接口和BeanDefinitionRegistryPostProcessor的相关逻辑。上面的obtainFreshBeanFactory中完成了BeanFactory的创建和相关BeanDefinition对象的组装,然后在接下来的prepareBeanFactory中会完成相关的准备工作。完成Bean对象的相关后置处理器的注册。具体的代码逻辑和上面是差不多的。注解表示的Java类,来处理其中的@Bean,@Primary等注解。原创 2025-05-06 22:54:48 · 1038 阅读 · 0 评论 -
Spring源码的扩展案例
4、在resource目录下创建META-INF目录下,并创建三个文件user.xsd</element></schema> 5、创建配置文件</beans> 6、编写测试类 在日常的工作中,我们经常遇到一些特殊的案例需要自定义属性的解析器来完成对应的属性解析工作,大家需要理解它的本质来进行随意的扩展工作,但是此处的扩展没有大家想象的那么简单,详细的流程讲课的时候我大概讲一下,但是要复杂很多。原创 2025-05-05 23:08:46 · 820 阅读 · 0 评论 -
Spring钩子方法的使用
当我们想获取BeanDefinitionRegistry对象,来自定义注册过程,可以实现接口,并重写方法。1、首先自定义一个注解叫MyService2、创建一个执行类 实现接口@Component@Override//根据BeanDefinitionRegistry对象获创建注解扫描器(Spring源码实现也是通过new 的方式)//ClassPathBeanDefinitionScanner类就是自定义注解的支撑// 添加自定义注解到注册器中// 指定注解扫描器的包路径(字符串)原创 2025-05-04 23:34:47 · 418 阅读 · 0 评论 -
Spring MVC 核心调用流程-返回值解析
当反射调用成功后,有可能方法会有返回值,而返回值处理也是一个比较重要的事情,根据什么样的方式把返回值响应回去,返回值响应时有可能是数据有可能是界面,如果返回数据的话,要把返回值解析成对应的格式,例如如果返回值是一个 list 对象,就需要解析这个 list 对象把 list 对象解析成 json 格式。返回值解析讨论跟入参解析基本上类似。类上面加上注解,这个包定义就是只对这个包里面的Controller生效。然后类里面的方法加上。原创 2025-05-04 22:41:56 · 850 阅读 · 0 评论 -
Spring MVC 核心调用流程
所在类:org.springframework.web.servlet.mvc.method.annotation.所在类:org.springframework.web.servlet.mvc.method.annotation.所在类:org.springframework.web.servlet.mvc.method.annotation.所在类:org.springframework.web.servlet.mvc.method.annotation.原创 2025-05-03 23:17:49 · 883 阅读 · 0 评论 -
Spring MVC和嵌入式Tomcat
导读Spring MVC是Spring框架的一部分,Spring MVC是基于Servlet规范来完成的一个请求响应模块,也是 spring 中比较大的一个模块,现在基本上都是零 xml 配置了,采用的是约定大于配置的方式,所以我们的Spring MVC也是采用这种零 xml 配置的方式。1、取代web.xml配置2、取代配置。原创 2025-05-03 23:14:48 · 780 阅读 · 0 评论 -
Spring的事务管理 - 隔离级别
在读取事务开始时,系统会给事务一个当前版本号,事务会读取版本号<=当前版本号的数据,这时就算另一个事务插入一个数据,并立马提交,新插入这条数据的版本号会比读取事务的版本号高,因此读取事务读的数据还是不会变。:一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对已有记录的更新(即晚于本事务开始的),并且该事务不要求与其他事务是“可串行化”的。最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。原创 2025-05-02 23:18:22 · 687 阅读 · 0 评论 -
Spring的事务管理 - 声明式事务
基于Spring AOP实现。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。编程式事务管理使用可实现更细粒度的事务控制。声明式事务管理不需要入侵代码,通过就可以进行事务操作,更快捷而且简单且大部分业务都可以满足,推荐使用。其实不管是编程式事务还是声明式事务,最终调用的底层核心代码是一致的。原创 2025-05-02 23:13:29 · 1135 阅读 · 0 评论 -
Spring AOP - 代理入口类
通过AopProxy 对象封装target 目标对象之后,ProxyFactoryBean方法得到的对象已经是一个AopProxy代理对象了,在ProxyFactoryBean 中配置的target目标对象不会让应用直接调用其方法的实现,对target目标对象的方法调用会被AopProxy代理对象拦截,对于不同的AopProxy代理对象生成方式,会使用不同的拦截回调入口。所在类 org.springframework.aop.framework.autoproxy.原创 2025-05-01 23:31:50 · 1040 阅读 · 0 评论 -
Spring AOP - ApectJ解析
Spring AOP与ApectJ的目的一致,都是为了统一处理横切业务,但与AspectJ不同的是,Spring AOP并不尝试提供完整的AOP功能(即使它完全可以实现),Spring AOP更注重的是与Spring IOC容器的结合,并结合该优势来解决横切业务的问题,因此在AOP的功能完善方面,相对来说AspectJ具有更大的优势,同时,Spring注意到AspectJ在AOP的实现方式上依赖于特殊编译器(ajc编译器),因此Spring很机智回避了这点,转向采用动态代理技术的实现原理来构建。原创 2025-05-01 23:28:48 · 862 阅读 · 0 评论 -
Bean的实例化-Bean的销毁
类文件: org.springframework.beans.factory.support.类文件: org.springframework.beans.factory.support.在 bean创建完成后就会对这个 bean注册一个销毁的。在这个类中收集了该bean 是否实现了。① Bean的销毁过程是什么时候触发的呢?方法,该方法就会根据前面的收集进行调用。后就会对这个 bean注册一个销毁的。方法最终也会掉用到Spring中的。类负责bean的销毁过工作。,这个类就是 销毁的核心类。原创 2025-04-30 22:49:42 · 458 阅读 · 0 评论 -
Bean的实例化-原型作用域
1、定义一个类继承接口,拿到类的引用,@Component@Override// 设置自定义的scope 名字,和解析类2、定义解析类// 通过 ThreadLocal 来管理bean/** 这个方法就是自己管理bean* */@Override= null) {} else {//这个方法就是调用createbean方法获得一个实例3、定义入口类@Component4、测试类@Testi < 10;原创 2025-04-30 22:46:50 · 506 阅读 · 0 评论 -
Bean的实例化-循环依赖
如果存在A中有B属性,B中有A属性,那么当依赖注入的时候,就会产生当A还没创建完的时候,由于对B的创建再次返回创建A,最终造成循环依赖。中,@Autowired注解的构造函数依赖注入,并且注入参数是引用类型的话,最终也会触发 getBean进行实例化。类文件: org.springframework.beans.factory.support.中,当前正在实例化的bean中有@Autowired注解的构造函数,触发getBean。以下代码就会产生循环依赖的问题,那么Spring 是如何解决的?原创 2025-04-29 23:18:29 · 869 阅读 · 0 评论 -
Bean的实例化-注解支持
支持了@PostConstruct、@PreDestroy、@Resource等注解的解析工作,但是真正对@PostConstruct、@PreDestroy两个注解的解析是由其父类。AutowiredAnnotationBeanPostProcessor后置处理器,主要处理@Autowired的解析。Spring初始化过程中,调用注解处理的几个主要埋点。Spring 注解的装配收集源码。原创 2025-04-29 23:07:43 · 917 阅读 · 0 评论 -
Bean的实例化-后置处理器
它们分别在任何bean初始化回调之前或之后执行(例如InitializingBean的afterPropertiesSet方法或自定义init-method方法之前或者之后), 在这个时候该bean的属性值已经填充完成了,并且我们返回的bean实例可能已经是原始实例的包装类型了。因为并不是所有功能都配置在xml文件中,有些业务场景(比如@Configuration注解修饰的类中@Bean修饰的方法完成的Bean的注入的场景)需要在程序运行时,动态的调用或者修改beanDefinition。原创 2025-04-29 22:59:53 · 1100 阅读 · 0 评论 -
Spring 容器中单例Bean的实例化和初始化
上一节对Spring容器初始化的核心方法refresh()中的方法流程已经全部分析完了,接下来进入refresh()中的方法,看看所有的单例bean是如何实例化的。原创 2025-04-28 23:38:17 · 770 阅读 · 0 评论 -
obtainFreshBeanFactory()方法
Spring容器初始化的核心方法refresh(),下面主要分析方法流程,也就是的创建过程的主要流程。Spring 容器的加载方式有四种,下面以第一种类路径获取配置文件的方式,来看看Spring 容器初始化过程是如何创建的。最终保存方式和默认标签的保存方式一致,都是放到对应的两个Map容器缓存起来。同时,核心方法refresh()中的方法执行完成,解析出来的xml标签封装成对象,然后通过方法 返回对象,至此创建填充的功能也全部完成。以上是核心方法refresh()中的方法中涉及的相关源码内容。原创 2025-04-28 23:22:59 · 812 阅读 · 0 评论 -
Spring源码篇-ApplicationContext
AbstractBeanDefinition我们可以称之为BeanDefinition的模板类。结构我们上面其实有梳理通过上面我们可以看到AbstractBeanDefinition 具备了 Bean元数据的获取和属性相关的操作。同时AbstractBeanDefinition的继承结构它主要用在spring内部的bean定义、把不同类型的bean定义合并成RootBeanDefinition(getMergedLocalBeanDefinition方法)。原创 2025-04-28 21:41:02 · 986 阅读 · 0 评论 -
结合设计模式自定义SpringIOC
这里的 BeanDefinition 就是我们所说的 Spring 的 Bean,我们自己定义的各个 Bean 其实会转换成一个个 BeanDefinition 存在于 Spring 的 BeanFactory 中//DefaultListableBeanFactory 中使用 Map 结构保存所有的 BeanDefinition 信息中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。原创 2025-04-27 22:34:17 · 869 阅读 · 0 评论 -
Spring中观察者模式的应用
事件机制的实现需要三个部分,事件源,事件,事件监听器,在上面介绍的ApplicationEvent就相当于事件,ApplicationListener相当于事件监听器,这里的事件源说的就是ApplicationEventPublisher.其实,观察者模式的别名就有一种叫法就是发布-订阅(Publish/Subscribe)模式, 我们来看一下观察者模式与发布订阅模式结构上的区别。实现一个需求:当调用一个类的方法完成时,该类发布事件,事件监听器监听该类的事件并执行的自己的方法逻辑。,而被通知的对象称为。原创 2025-04-27 00:01:08 · 1003 阅读 · 0 评论 -
Spring中工厂模式的应用
FactoryBean表现的是一个工厂的职责,如果一个BeanA 是实现FactoryBean接口,那么A就是变成了一个工厂,根据A的名称获取到的实际上是工厂调用getObject()方法返回的对象,而不是对象本身,如果想获取工厂对象本身,需要在名称前面加上 '&'符号。在Spring中,BeanFactory是工厂的顶层接口,也是IOC容器的核心接口,因此BeanFactory中定义了。Spring Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory。Bean组件定义在Spring的。原创 2025-04-26 22:59:20 · 799 阅读 · 0 评论 -
Spring源码手写篇-手写DI
DI(Dependency injection)依赖注入。对象之间的依赖由容器在运行期决定,即容器动态的将某个依赖注入到对象之中。说的直白点就是给Bean对象的成员变量赋值。在这里我们就需要明白几个问题。原创 2025-04-23 22:56:06 · 1083 阅读 · 0 评论 -
Spring源码手写篇-手写IoC
根据上面的接收我们就清楚了Bean定义的意义了。那么我们来定义Bean定义的模型要考虑几个问题。作用肯定是告诉Bean工厂应该如何来创建某类的Bean实例。原创 2025-04-23 21:56:01 · 984 阅读 · 0 评论 -
Spring源码手写篇-手写AOP
手写IoC和DI后已经实现的类图结构。原创 2025-04-24 01:32:14 · 971 阅读 · 0 评论