• 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.2spring-corekotlin-coroutinesuildlibskotlin-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:解决不同模块依赖版本不同问题

  • 相关阅读:
    关于React的脚手架
    yarn和npm
    谈谈NPM和Webpack的关系
    php开发环境和框架phalcon的搭建
    Centos6.5--svn搭建
    System.Diagnostics.Process.Start(ProcessStartInfo)
    PHP错误:call to undefined function imagecreatetruecolor
    PostgreSQL删除表中重复数据行
    URL存在http host头攻击漏洞-修复方案
    for循环的执行顺序
  • 原文地址:https://www.cnblogs.com/liuyangfirst/p/13526619.html
Copyright © 2020-2023  润新知