相关文档
Spring Framework: https://spring.io/projects/spring-framework/ Reference: https://docs.spring.io/spring-framework/reference/index.html
- 容器介绍 (基于Xml的容器) Introduction to the Spring IoC Container and Beans
- 基于Java (注解) 的容器配置: Java-based Container Configuration
- Spring Expression Language (SpEL): Spring Expression Language (SpEL)
- Transaction Management: Transaction Management
环境准备
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 的源码跑起来:
- 在 Download 下来的Spring 源码项目, 新建一个子模块
- 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()
}
踩坑指南
源码部署遇到的几个问题
- idea webapp的项目 artifacts 方式 无论是 exploded 还是 archivel类类型; 已经在 output directory 和war压缩包中看到编译出来的 class了; Tomcat Server 跑起来就是报NoClassDefFoundError
- 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 的生命周期
