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
View Code

如上图表示安装成功.

     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
View Code

显示成功后即安装成功.


三. 装入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 径地址)
View Code

 

   6、修改全局(根目录下的)build.gradle文件(这个就相当于是maven的pom文件),在文件头部加上。

    (1)、添加如下:

1 buildscript {
2    repositories {
3      // 新的spring库
4      maven { url "https://repo.spring.io/plugins-release" }
5     }
6 }
View Code

 

        (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 }
View Code

     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   }
View Code

         (2)settings.gradle内容(如果没有文件自行添加)

1 rootProject.name = 'spring-2020test'
View Code

    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 }
View Code

     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 }
View Code
         (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 }
View Code
         (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 }
View Code

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

 

posted @ 2020-08-18 22:47  北极的大企鹅  阅读(389)  评论(2编辑  收藏