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).安装成功后查看版本.

执行

 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版本,执行命令如下:

 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

内容:

 distributionUrl=file:///e:/dev_env/gradle-6.5.1-all.zip(这里选择gradle的压缩包的全路
径地址)

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

(1)、添加如下:

 buildscript {
repositories {
// 新的spring库
maven { url "https://repo.spring.io/plugins-release" }
}
}

(2)、找到如图位置代码,修改内容如下:

 repositories {
//新增以下2个阿里云镜像
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" }
// Reactor
maven { url "https://repo.spring.io/milestone" }
//新增spring插件库
maven { url "https://repo.spring.io/plugins-release" }
}

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内容(如果没有文件自行添加)

   plugins {
id 'java'
} group 'org.example'
version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories {
mavenCentral()
} dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}

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

 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个核心模块,具体如下:

 dependencies {

     //添加完要构建一下,否则代码中无法引用
compile(project(":spring-context"))
compile(project(":spring-beans"))
compile(project(":spring-core"))
compile(project(":spring-aop"))
testCompile group: 'junit', name: 'junit', version: '4.12'
}

6、编写一个简单的applicationContext获取容器用的bean,用来测试Spring源码构建编译过程是否成功

(1)实体类创建

 package com.youlai.spring.ch01.pojo;

 /**
* @author liuyangos8888
* <p>
* 用户类
*/
public class User { private String id;
private String userName;
private String age;
private String work;
private String salary; private StringBuilder stringBuilder = new StringBuilder(); public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public String getWork() {
return work;
} public void setWork(String work) {
this.work = work;
} public String getSalary() {
return salary;
} public void setSalary(String salary) {
this.salary = salary;
} @Override
public String toString() { stringBuilder.append("User :{");
stringBuilder.append("id='" + id);
stringBuilder.append("'\\''");
stringBuilder.append(", userName='" + userName);
stringBuilder.append("'\\''");
stringBuilder.append(", age='" + age);
stringBuilder.append("'\\''");
stringBuilder.append(", work='" + work);
stringBuilder.append("'\\''");
stringBuilder.append(", salary='" + salary);
stringBuilder.append("'\\''");
stringBuilder.append("'}'"); return stringBuilder.toString();
}
}
(2)创建配置类

 package com.youlai.spring.ch01.config;

 import com.youlai.spring.ch01.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; /**
* @author liuyangos8888
*/
@Configuration
@ComponentScan("com.youlai.spring.ch01.**")
public class ContextConfig { @Bean
public User user() { User user = new User(); user.setId("1");
user.setUserName("小明");
user.setAge("18");
user.setSalary("20000.00");
user.setWork("架构师"); return user;
}
}
(3)测试类

 package com.youlai.spring.ch01;

 import com.youlai.spring.ch01.config.ContextConfig;
import com.youlai.spring.ch01.pojo.User;
import com.youlai.spring.ch01.service.IUserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; /**
* @author liuyangos8888
*/
public class ContextApplication { public static void main(String[] args) { System.out.println("启动..........."); long startTime = System.currentTimeMillis(); System.out.println("开始时间:" + startTime + "毫秒"); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
ContextConfig.class
); User bean = context.getBean(User.class); System.out.println("信息:" + bean.toString()); long endTime = System.currentTimeMillis(); System.out.println("结束时间:" + endTime + "毫秒"); System.out.println("耗时:" + (endTime - startTime) + "毫秒"); } }

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

Spring源码阅读 ------------------- SpringFrameWork 5.2 +IDEA 部署的更多相关文章

  1. Sping学习笔记(一)----Spring源码阅读环境的搭建

    idea搭建spring源码阅读环境 安装gradle Github下载Spring源码 新建学习spring源码的项目 idea搭建spring源码阅读环境 安装gradle 在官网中下载gradl ...

  2. Spring源码阅读 之 配置的读取,解析

    在上文中我们已经知道了Spring如何从我们给定的位置加载到配置文件,并将文件包装成一个Resource对象.这篇文章我们将要探讨的就是,如何从这个Resouce对象中加载到我们的容器?加载到容器后又 ...

  3. 搭建 Spring 源码阅读环境

    前言 有一个Spring源码阅读环境是学习Spring的基础.笔者借鉴了网上很多搭建环境的方法,也尝试了很多,接下来总结两种个人认为比较简便实用的方法.读者可根据自己的需要自行选择. 方法一:搭建基础 ...

  4. Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)

    我们到底能走多远系列(33) 扯淡: 各位:    命运就算颠沛流离   命运就算曲折离奇   命运就算恐吓着你做人没趣味   别流泪 心酸 更不应舍弃   ... 主题: Spring源码阅读还在继 ...

  5. 初始化IoC容器(Spring源码阅读)

    初始化IoC容器(Spring源码阅读) 我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? ...

  6. Spring源码阅读-ApplicationContext体系结构分析

    目录 继承层次图概览 ConfigurableApplicationContext分析 AbstractApplicationContext GenericApplicationContext Gen ...

  7. Spring源码阅读笔记02:IOC基本概念

    上篇文章中我们介绍了准备Spring源码阅读环境的两种姿势,接下来,我们就要开始探寻这个著名框架背后的原理.Spring提供的最基本最底层的功能是bean容器,这其实是对IoC思想的应用,在学习Spr ...

  8. Spring源码阅读笔记

    前言 作为一个Java开发者,工作了几年后,越发觉力有点不从心了,技术的世界实在是太过于辽阔了,接触的东西越多,越感到前所未有的恐慌. 每天捣鼓这个捣鼓那个,结果回过头来,才发现这个也不通,那个也不精 ...

  9. idea构建spring源码阅读环境

    注:由于文章不是一次性完成,下文中的test1目录和test目录应为同一个目录. (一)安装git和Gradle Spring项目托管在github之上,基于Gradle来构建项目.所以要想搭建Spr ...

随机推荐

  1. 题解 UVA11865 【Stream My Contest】

    最小树形图(朱刘算法)\(+\) 二分答案. 由题意得,我们要在一些有向边中选出一些边,使\(0\)号节点能够到达其他节点,使距离之和\(\leqslant cost\),并且使每条边中的带宽的最小值 ...

  2. 基于Python爬虫采集天气网实时信息

      相信小伙伴们都知道今冬以来范围最广.持续时间最长.影响最重的一场低温雨雪冰冻天气过程正在进行中.预计,今天安徽.江苏.浙江.湖北.湖南等地有暴雪,局地大暴雪,新增积雪深度4-8厘米,局地可达10- ...

  3. python3的字符串常用方法

    find()# 方法 find()# 范围查找子串,返回索引值,找不到返回-1 # 语法 s.find(substring, start=0, end=len(string)) # 参数 # subs ...

  4. springboot(二)配置SpringBoot支持自动装载Servlet

    Servlet详解:https://blog.csdn.net/yanmiao0715/article/details/79949911 Web 技术成为当今主流的互联网 Web 应用技术之一,而 S ...

  5. 【NeurlPS2019】Positional Normalization 位置归一化

    作者提出,当前的BatchNorm, GroupNorm, InstanceNorm在空间层面归一化信息,同时丢弃了统计值.作者认为这些统计信息中包含重要的信息,如果有效利用,可以提高GAN和分类网络 ...

  6. 究竟什么时候该使用MQ?

    究竟什么时候该使用MQ? 原创: 58沈剑 架构师之路  昨天 任何脱离业务的组件引入都是耍流氓.引入一个组件,最先该解答的问题是,此组件解决什么问题. MQ,互联网技术体系中一个常见组件,究竟什么时 ...

  7. 萌新学渗透系列之Hack The Box_Devel

    我将我的walkthrough过程用视频解说的形式记载 视频地址https://www.bilibili.com/video/BV1Ck4y1B7DB 一是因为看我视频的后来者应该都是刚入门的新手,视 ...

  8. let、const、var的区别

    1.使用var声明的变量,其作用域为全局或者该语句所在的函数内,且存在变量提升现象. 下面使用node.js演示,也可以插入到html文件中使用以下代码 var a = 10; function te ...

  9. PHP date_diff() 函数

    ------------恢复内容开始------------ 实例 计算两个日期间的差值: <?php$date1=date_create("2013-03-15");$da ...

  10. Springboot拦截器使用及其底层源码剖析

    博主最近看了一下公司刚刚开发的微服务,准备入手从基本的过滤器以及拦截器开始剖析,以及在帮同学们分析一下上次的jetty过滤器源码与本次Springboot中tomcat中过滤器的区别.正题开始,拦截器 ...