准备工作
本示例基于 SpringV5.2.7RELEASE+GradleWapper+jdk1.8.0_131编译
环境准备
- maven
- jdk8+
- idea
源码下载
- 进入https://github.com/spring-projects/spring-framework
Spring的源码是发布在github上面的
- 下载最新版发布版源码
,只要5.x的正式发布(RELEASE)版本就行, 因为Spring中Ioc AOP核心分支是不会有变化的, 变的只有微小的细节。
![4a59e71ee3afbe3d6d0994b42b88e3a1.png](https://i-blog.csdnimg.cn/blog_migrate/f4be6d0b10773a2799859b99e22dfc21.jpeg)
稍微介绍版本代号
![be14cdc3bafd37b21ede3c38fe8f5d5c.png](https://i-blog.csdnimg.cn/blog_migrate/d058475e122092339b749361393a24b6.jpeg)
M:
M1,M2,…中的M是milestone的简写,意思是里程碑,代表着有重大改进的版本。
构建工具准备:
安装源码对应的gradle版本(也可不安装),建议使用gradleWraper中的gradle。
Gadle介绍:
Gradle是个构建系统,能够简化你的编译、打包、测试过程。熟悉Java的同学,可以把Gradle类比成Maven。
Gradle Wrapper的作用是简化Gradle本身的安装、部署。不同版本的项目可能需要不同版本的Gradle,手工部署的话比较麻烦,而且可能产生冲突,所以需要Gradle Wrapper帮你搞定这些事情。Gradle Wrapper是Gradle项目的一部分。
Gradle 无需花时间去深入学习,因为我们在学习源码的过程不会过多涉及到 gradle,当然有兴趣可以去学习, 相当于后起之秀,但是maven已经够优秀了,应该也没有办法替代maven。
gradleWraper 在该文件中有体现,相当于远程自动下载(所以你可以下载gradle,也可以不下,因为会使用远程的统一版本):spring-framework-5.2.7.RELEASEgradlewrappergradle-wrapper.properties
所以如果你需要下载也最好下载该链接对应的gradle版本
![08584316f24d862169b342d0ea140e78.png](https://i-blog.csdnimg.cn/blog_migrate/66d1f156d01a7906f46bf49098b12b5f.png)
修改build.gradle
这个文件就相当于我们Maven的pom.xml 管理项目的依赖等信息...
设置镜像
repositories {
maven{ url 'https://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
mavenCentral()
maven { url "https://repo.spring.io/libs-spring-framework-build" }
}
编译工作
按照官网的方式编译:
使用gradlew(gradle-wrapper命令) 先编译 oxm:compileTest Java: Precompile spring-oxm with ./gradlew :spring-oxm:compileTestJava
- 编译compileTestJava模块
打开源码所在文件夹,在windows cmd命令中输入,在windows中当前目录无需输入“./”。
gradlew :spring-oxm:compileTestJava
配置了镜像很快(一两分钟)就能编译完成, 如果要很久说明你的镜像没起作用,如果编译异常请自行百度,每个人的电脑及环境产生的异常都有可能。
![4c300d301548ef522f06b8c244c66063.png](https://i-blog.csdnimg.cn/blog_migrate/235a8864c8d1203a50502372f6e98487.jpeg)
- 导入项目到idea中
导入项目到idea中:Import into IntelliJ (File -> New -> Project from Existing Sources -> Navigate to directory -> Select build.gradle)
将项目导入到idea中提示配置gradle,按照如下配置
![63a01839273baacf8dca31e7ea5c34c1.png](https://i-blog.csdnimg.cn/blog_migrate/5a45e3d9f63c9ca8f97f352416c5736d.jpeg)
导入后等待编译,莫急,需要一点点时间,编译完成:
![bdd8f424e3a2fe4632e33a3db19008a6.png](https://i-blog.csdnimg.cn/blog_migrate/26acbfaf364d6dbcc6f5310633392838.jpeg)
- 添加测试模块代码:
添加测试代码:Code away
new->model->gradle-->输入模块名称
![b10b7d9ef2b782479be3bc99967acb27.png](https://i-blog.csdnimg.cn/blog_migrate/e7e38e7c4f4378d9692b0492ae76846d.jpeg)
![23280068cbb259fd153cb49a6e1c7bdd.png](https://i-blog.csdnimg.cn/blog_migrate/49be82ac848289181a5074f27eca1e5a.jpeg)
编写代码测试ioc功能
- 添加依赖
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile(project(":spring-context"))
}
compile(project(":spring-context")) 代表本项目的
- 随意添加任意bean:
@Service
public class UserServiceImpl {
public void sayHi(){
System.out.println("Hello Spring!");
}
}
- 添加启动配置类:
Configuration
@ComponentScan("cn.xxx")
public class MainStat {
public static void main(String[] args) {
ApplicationContext context=new AnnotationConfigApplicationContext(MainStat.class);
UserServiceImpl bean = context.getBean(UserServiceImpl.class);
bean.sayHi();
}
}
- 正确输出,大功告成!
![4e7c0bf587ad094a1a5a58fefa6a05e8.png](https://i-blog.csdnimg.cn/blog_migrate/8459b71984924f043da2f4027e45b5f1.png)