Spring源码阅读 ------------------- SpringFrameWork 5.2 +IDEA 部署(一)
Spring作为JAVA学习者的必须学习和熟悉的框架,需要理解Spring的设计原理,核心设计模式,对于理解设计模式,面向对象的深入理解有着深远持久的影响,特此首先要做到本地部署源码开始,下面将介绍如何本地部署Spring源码.
一. 准备工具
- 下载GIT
- 安装JDK1.8
- 安装下载gradle
- 安装好IDEA
1. git
官网下载地址:https://git-scm.com/downloads
作用:代码托管工具,代码拉取使用
2. JDK1.8及以上版本
用于JAVA开发使用的环境
3. gradle下载及安装
(1).官网下载地址:https://services.gradle.org/distributions/
(2).查看源码framework-bom下的gradle下的wrapper的gradle-wrapper.properties文件,查看distributionUrl的版本,然后在官网上对应下载all的zip文件,以便出错可以看其源码问题.
(3).安装成功后查看版本.
执行
1 gradle -v
如上图表示安装成功.
4. IDEA 2019 版本以上
本文采用的是2019的版本.
二. 下载源码
1.官网地址:https://github.com/spring-projects/spring-framework
2.将官网地址贴到gitee上生成gitee仓库,因为github是外国服务器,通过gitee中转下载本地的速度会提高.
(1).进入官网地址,复制URL.
(2)进入gitee,选择右上角加号,选择从GITHUB/GITEE导入仓库
(3)粘贴复制的github地址到第一栏,然后为自己的仓库命名.
等待十几分钟,最新版的springframework就导入到gitee库中了.
(4)下载gitee代码到本地文件夹中.
由于最新的5.3版本有些JDK问题,所以这里选择稳定的版本5.2版本,执行命令如下:
1 git clone -b 5.2.x https://gitee.com/mrliuNumberOne/spring-framework5.2.git
显示成功后即安装成功.
三. 装入IDEA,构建项目
1.IDEA操作:File--> OPEN --> 选择FRAMEWORK的项目
2.选择以项目的方式导入,选择 New Windows.
3.设置IDEA的GRADLE,File-->setting-->Build,Excution-->Build Tool--->Gradle
设置参数
4、设置 Kotlin Compiler,在Setting中搜索。
设置Target JVM Version 为1.8版本
5、修改framework-bome模块-->gradle-->wrapper-->gradle-wrapper.properties
内容:
1 distributionUrl=file:///e:/dev_env/gradle-6.5.1-all.zip(这里选择gradle的压缩包的全路 2 径地址)
6、修改全局(根目录下的)build.gradle文件(这个就相当于是maven的pom文件),在文件头部加上。
(1)、添加如下:
1 buildscript { 2 repositories { 3 // 新的spring库 4 maven { url "https://repo.spring.io/plugins-release" } 5 } 6 }
(2)、找到如图位置代码,修改内容如下:
1 repositories { 2 //新增以下2个阿里云镜像 3 maven { url 'https://maven.aliyun.com/nexus/content/groups/public/'} 4 maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' } 5 mavenCentral() 6 maven { url "https://repo.spring.io/libs-spring-framework-build" } 7 // Reactor 8 maven { url "https://repo.spring.io/milestone" } 9 //新增spring插件库 10 maven { url "https://repo.spring.io/plugins-release" } 11 }
7、编译全局代码,选择右侧,圆圈符号编译
四. 编译项目
1、编译spring-oxm模块
点击右上角gradle打开编译视图,找到spring-oxm模块,然后在other下找到compileTestjava,双击即可
2、编译spring-core模块
点击右上角gradle打开编译视图,找到spring-core模块(因为之后的spring-context依赖于core),然后在other下找到compileTestjava,双击即可
3、编译整个工程(过程耗时间,可能10-20分钟!),如下图:打开顶层spring->build->build,经过一段时间编译,build成功。
五. 测试源码
1、添加新的模块,测试模块,File-->New --> Module
2、选择构建Gradle项目,Next,添加内容。
3、添加后如图所示,生成build.gradle和settings.gradle
(1)build.gradle内容(如果没有文件自行添加)
1 plugins { 2 id 'java' 3 } 4 5 group 'org.example' 6 version '1.0-SNAPSHOT' 7 8 sourceCompatibility = 1.8 9 10 repositories { 11 mavenCentral() 12 } 13 14 dependencies { 15 testCompile group: 'junit', name: 'junit', version: '4.12' 16 }
(2)settings.gradle内容(如果没有文件自行添加)
1 rootProject.name = 'spring-2020test'
4、打开全局配置文件:settings.gradle文件,拉到最下面,我们看到系统自动加上了spring-2020mytest模块
5、测试模块spring-mytest,打开build.gradle文件(相当于是pom文件),默认dependencies依赖(这里的dependencies和maven里的依赖是一样的)只有一个junit,需要手工添加spring-context,spring-beans,spring-core,spring-aop这4个核心模块,具体如下:
1 dependencies { 2 3 //添加完要构建一下,否则代码中无法引用 4 compile(project(":spring-context")) 5 compile(project(":spring-beans")) 6 compile(project(":spring-core")) 7 compile(project(":spring-aop")) 8 testCompile group: 'junit', name: 'junit', version: '4.12' 9 }
6、编写一个简单的applicationContext获取容器用的bean,用来测试Spring源码构建编译过程是否成功
(1)实体类创建
1 package com.youlai.spring.ch01.pojo; 2 3 /** 4 * @author liuyangos8888 5 * <p> 6 * 用户类 7 */ 8 public class User { 9 10 11 private String id; 12 private String userName; 13 private String age; 14 private String work; 15 private String salary; 16 17 private StringBuilder stringBuilder = new StringBuilder(); 18 19 public String getId() { 20 return id; 21 } 22 23 public void setId(String id) { 24 this.id = id; 25 } 26 27 public String getUserName() { 28 return userName; 29 } 30 31 public void setUserName(String userName) { 32 this.userName = userName; 33 } 34 35 public String getAge() { 36 return age; 37 } 38 39 public void setAge(String age) { 40 this.age = age; 41 } 42 43 public String getWork() { 44 return work; 45 } 46 47 public void setWork(String work) { 48 this.work = work; 49 } 50 51 public String getSalary() { 52 return salary; 53 } 54 55 public void setSalary(String salary) { 56 this.salary = salary; 57 } 58 59 60 @Override 61 public String toString() { 62 63 stringBuilder.append("User :{"); 64 stringBuilder.append("id='" + id); 65 stringBuilder.append("'\\''"); 66 stringBuilder.append(", userName='" + userName); 67 stringBuilder.append("'\\''"); 68 stringBuilder.append(", age='" + age); 69 stringBuilder.append("'\\''"); 70 stringBuilder.append(", work='" + work); 71 stringBuilder.append("'\\''"); 72 stringBuilder.append(", salary='" + salary); 73 stringBuilder.append("'\\''"); 74 stringBuilder.append("'}'"); 75 76 77 return stringBuilder.toString(); 78 } 79 }
(2)创建配置类
1 package com.youlai.spring.ch01.config; 2 3 4 import com.youlai.spring.ch01.pojo.User; 5 import org.springframework.context.annotation.Bean; 6 import org.springframework.context.annotation.ComponentScan; 7 import org.springframework.context.annotation.Configuration; 8 9 /** 10 * @author liuyangos8888 11 */ 12 @Configuration 13 @ComponentScan("com.youlai.spring.ch01.**") 14 public class ContextConfig { 15 16 17 @Bean 18 public User user() { 19 20 User user = new User(); 21 22 user.setId("1"); 23 user.setUserName("小明"); 24 user.setAge("18"); 25 user.setSalary("20000.00"); 26 user.setWork("架构师"); 27 28 return user; 29 } 30 }
(3)测试类
1 package com.youlai.spring.ch01; 2 3 import com.youlai.spring.ch01.config.ContextConfig; 4 import com.youlai.spring.ch01.pojo.User; 5 import com.youlai.spring.ch01.service.IUserService; 6 import org.springframework.context.annotation.AnnotationConfigApplicationContext; 7 8 9 /** 10 * @author liuyangos8888 11 */ 12 public class ContextApplication { 13 14 15 public static void main(String[] args) { 16 17 System.out.println("启动..........."); 18 19 long startTime = System.currentTimeMillis(); 20 21 System.out.println("开始时间:" + startTime + "毫秒"); 22 23 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( 24 ContextConfig.class 25 ); 26 27 User bean = context.getBean(User.class); 28 29 System.out.println("信息:" + bean.toString()); 30 31 long endTime = System.currentTimeMillis(); 32 33 System.out.println("结束时间:" + endTime + "毫秒"); 34 35 System.out.println("耗时:" + (endTime - startTime) + "毫秒"); 36 37 } 38 39 }
(4)ApplicationContext结构图
(5)结果
六. 导入依赖jar包
1.File --> Project Structure -->Libraries--> "+"-->Java
2.进入目录\spring-framework-5.2\spring-core\kotlin-coroutines\build\libs\kotlin-coroutines-5.2.0-SNAPSHOT.jar
3、在弹出的对话框中选择spring-core.main,再重新build项目即可,另一个包spring-core-5.2.9.BUILD-SNAPSHOT ,同样方法导入.
4、其他缺失包的方法同上。
附:spring源代码各个模块作用
主要模块:
spring-core:核心模块 依赖注入IOC和DI的最基本实现
spring-beans: Bean工厂与装配
spring-context:上下文,即IOC容器
spring-context-support:对IOC的扩展,以及IOC子容器
spring-context-indexer:类管理组件和Classpath扫描
spring-expression:表达式语句
切面编程:
spring-aop:面向切面编程,CGLIB,JDKProxy
spring-aspects:集成AspectJ,Aop应用框架
spring-instrument:动态Class Loading模块
数据访问与集成:
spring-jdbc:提供JDBC主要实现模块,用于简化JDBC操作
spring-tx: spring-jdbc事务管理
spring-orm:主要集成Hibernate,jpa,jdo等
spring-oxm:将java对象映射成xml数据或将xml映射为java对象
spring-jms:发送和接受消息
web组件:
spring-web:提供了最基础的web支持,主要建立在核心容器上
spring-webmvc:实现了spring mvc的web应用
spring-websocket:主要与前端页的全双工通讯协议
spring-webflux:一个新的非阻塞函数式Reactive Web框架
报文:
spring-messaging: 4.0加入的模块,主要集成基础报文传送应用
测试:
spring-test:测试组件
集成兼容:
spring-framework-bom:解决不同模块依赖版本不同问题