相关文档

Spring Framework: https://spring.io/projects/spring-framework/ Reference: https://docs.spring.io/spring-framework/reference/index.html

环境准备

Spring framework 源码项目

github: https://github.com/spring-projects/spring-framework 实例 v6.1.1版本源码: https://github.com/spring-projects/spring-framework/releases/tag/v6.1.1

Gradle

Spring framework 源码使用 gradle 进行构建

版本需 7.6 以上; 我这里用的是 Gradle 8.4 版本 : https://gradle.org/next-steps/?version=8.4&format=bin N_Gradle

实例项目

基于Spring Framework 的源码跑起来:

  1. 在 Download 下来的Spring 源码项目, 新建一个子模块
  2. new module > my-learn-spring > gradle项目

添加源码项目依赖 context, aop ...

plugins {  
	id 'java'  
}  
group = 'org.yang.learn.spring'  
version = '0.0.1'  
 
repositories {  
	mavenCentral()  
}  
dependencies { 
implementation( project(':spring-context'))  
implementation( project(':spring-aop'))  
implementation( project(':spring-jdbc'))
	testImplementation platform('org.junit:junit-bom:5.9.1')  
	testImplementation 'org.junit.jupiter:junit-jupiter'  
}  
test {  
	useJUnitPlatform()  
}
 

踩坑指南

源码部署遇到的几个问题

  1. idea webapp的项目 artifacts 方式 无论是 exploded 还是 archivel类类型; 已经在 output directory 和war压缩包中看到编译出来的 class了; Tomcat Server 跑起来就是报NoClassDefFoundError
  2. artifacts 出来了产物, 没有将依赖的项目 resources目录的文件编译出来, 只有 class文件 例如: tx模块的 spring.handlers, spring.schemas, web模块的 ContextLoader.properties;  

 解决是: 项目 facets 标记的 web resource directory 目录, 是 ./src/main/ 目录下面, 比如: /src/main/webapp, 不然web.xml配置的 classpath:.., <servlet-class> idea全报红 很难看    3. lib各jar依赖报错的问题, 我这里报的是 Caused by: java.lang.IllegalArgumentException: 找到多个名为org_apache_tomcat_websocket的片段。这是不合法的相对排序。有关详细信息,请参阅Servlet规范的第8.2.2 2c节。考虑使用绝对排序。 at org.apache.tomcat.util.descriptor.web.WebXml.orderWebFragments(WebXml.java:2203) 4. 稍微注意一下 java ee 和 jakarta ee 的问题, tomcat 10 默认是 jakarta ee 的api

归档

Transclude of my-learn-spring.zip

源码学习总结

Spring IOC 关键的接口

  • Spring BeanFactory 接口 - 用于获取、创建和存放bean 的工厂 (工厂模式)。
  • Spring BeanDefinition 接口 - Bean 定义的元数据对象, 可以理解为一个bean 对应一个 BeanDefinition 的描述。
  • Spring BeanFactoryPostProcessor 接口 - Spring 预留的扩展点, 在 BeanFactory 加载完所有的 BeanDefinition 但是尚未实例化任何Bean时调用,设计主要目的是对 BeanDefinition 进行扩展。
  • Spring BeanPostProcessor 接口 - Spring 预留的扩展点,会在Bean实例化 填充属性 调用Aware 后 回调的扩展点, 设计的主要目的是针对Bean的实例进行扩展。
  • Spring Aware 接口 - Spring 给Bean 感知/获取到 Spring 容器内部组件的回调接口, 例如: 实现 ApplicationContextAware 接口Spring 会给你注入 ‘容器对象’, 实现 EnvironmentAware 接口Spring 会给你注入 ‘环境对象’ 可获取环境变量等.
  • Spring 中的Event机制 - Spring 内置的事件订阅、通知机制,可以监听Spring 容器内部的启动、刷新等事件,也可以扩展自定义事件,实现框架系统的解耦 (观察者模式)。

Spring IOC 源码过程

Spring IOC 源码学习 基本姿势 Spring IOC 源码学习 XML详细加载流程总结 Spring IOC 中的循环依赖&三级缓存

Spring IOC 容器加载的详细流程

Spring IOC Bean 的生命周期