spring源码学习笔记,要点归纳和代码理解
前言
作为一名Java开发,可以说天天与spring打交道了,虽然调试时也可以在IDE中看一些源码,但系统的学习一遍源码,尤其是核心的IoC,DI,AOP等几个模块,不仅能够加深框架的理解,其中的许多技巧和思想也能运用到自己的代码中。
ok,废话少说,先来看一下spring源码的导入和编译。
环境参数(被坑了好久总结出来的)
- os: macOS 10.14.4
- JDK: 1.8.0_172
- IDE: IntelliJ IDEA 2018.1.2(Ultimate)
- spring-framework版本: 5.2.0,直接从git仓库clone.spring-frmamework 下载速度太慢的同学可参考:提高github的clone速度
- gradle版本: 4.10.3 因为没用过gradle,此处被坑了好久。gradle的安装不要使用homebrew,一定要自己从官网下载需要的版本。具体可百度,此处不作敷述。
- IDEA的kotlin插件: 1.3.21 手动安装可参考: IntelliJ IDEA手动更新Kotlin
导入步骤
以上环境搭建完成,之后的步骤可以说事半功倍了。 导入idea的同学可参考项目下的import-into-idea.md。
- 预编译
spring-oxm·
./gradlew :spring-oxm:compileTestJava
耗时几分钟 - 项目以gradle项目导入IDEA
此处的gradle使用我们之前自己安装的4.10.3版本,不要用IDE自带的
之后idea会自动编译整个项目,大概半小时左右。 -
将aspectj模块排除
创建测试项目
导入成功之后可以在project下创建一个自己的测试module
-
项目根目录右键 -> new -> module -> gradle
- 在新项目的build.gradle下添加对spring模块的依赖,这里我先添加了spring-beans 和spring-core的依赖。
dependencies {
compile(project(":spring-beans"))
compile(project(":spring-core"))
testCompile group: 'junit', name: 'junit', version: '4.12'
}
- 在新项目的src/main/resource下添加spring-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myTestBean" class="com.pctf.beans.MyTestBean"/>
</beans>
- 创建测试bean和启动类
package com.pctf.beans;
public class MyTestBean {
private String name = "testName";
public MyTestBean(String name) {
this.name = name;
}
public MyTestBean() {
}
@Override
public String toString() {
return "MyTestBean{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class AppTest {
public static void main(String[] args) {
BeanFactory bf = new XmlBeanFactory( new ClassPathResource("spring-config.xml"));
MyTestBean myTestBean = (MyTestBean) bf.getBean("myTestBean");
System.out.println(myTestBean.getName());
}
}
之后就可以愉快的调试spring源码了。
后记
整个导入编译过程其实还是费了挺多时间的,主要是没接触过gradle和kotlin,导致花在搭建编译环境上的精力太多。
整个过程建议全程科学上网。各种卡顿或者速度慢的问题都有可能是墙的原因。
网友评论