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  * 

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:解决不同模块依赖版本不同问题