【Spring5源码学习】Spring基础介绍及调试环境搭建

news2024/9/28 15:30:44

Spring 是一款用于简化企业级 Java 应用开发的分层开源框架,有着强大的扩展和融合能力,它善于整合各种单层框架并建立起完整的体系,能高效统一的构造可提供企业级服务的应用系统。

1、Spring 概述

Spring Framework 是一个分层非常清晰并且依赖关系、职责定位非常明确的轻量级架构,主要有以下八大模块:数据处理模块(Data Access/Integration)、Web 模块、AOP(Aspect Oriented Programming)模块、Aspects 模块、Instrumentation 模块、Messaging 模块、Core Container 模块和 Test 模块。

正是依靠着这些基本模块,Spring 实现了一个融合了现有解决方案的零侵入的轻量级框架,如图所示:

接下来,对八大模块进行必要的简要说明:

1、数据处理模块(Data Access/Integration):由 JDBC、ORM、OXM、JMS 和 Transactions 等模块组成。

  •  JDBC 模块:消除编写冗长的JDBC代码和解析数据库厂商特有的错误代码,它提供了Spring对JDBC数据访问进行封装的所有类;
  • ORM 模块:提供了流行的 Object-Relational Mapping(对象-关系映射)API 集成层,包含JPA、JDO 和 Hibernate 等 ORM 框架。

Spring 对 ORM 的支持和封装主要体现在3个方面:①. 一致的异常处理体系结构,对第三方 ORM 框架抛出的专有异常进行了包装;②. 一致的DAO抽象的支持,为每个框架都提供了模板类来简化和封装常用操作,比如 JdbcSupport、HibernateTemplate;③. Spring 的事务管理机制,为所有数据访问都提供了一致的事务管理。

  • OXM 模块:提供抽象层,用于支持 Object/XML mapping(对象/XML映射)的实现,例如JAXB、Castor、XMLBeans、JiBX 和 XStream 等;
  • JMS 模块:即 Java Messaging Service,包含生产和消费信息的功能;
  • Transactions 模块:支持编程和声明式事务管理。

2、Web 模块:由 Web、WebSocket、Servlet 和 Portlet 等模块组成。

  • Web 模块:提供了面向 Web 开发的集成功能;
  • WebSocket 模块:提供了面向 WebSocket 开发的集成功能。
  • Servlet 模块(或 SpringMVC 模块):包含 Spring 的 Model-View-Controller 和 REST Web Services 实现的 Web 应用程序。Spring MVC 框架使 Domain Model(领域模型)代码和 Web Form(网页)代码实现了完全分离,并且集成支持了 Spring Framework 的所有功能。
  • Portlet 模块(或 Portlet MVC 模块):是基于 Web 和 Servlet 模块的 MVC 实现的。

Portlet 和 Servlet 的最大区别是对请求的处理分为 Action 阶段和 Render 阶段。在处理一次  HTTP 请求时,在 Action 阶段处理业务逻辑响应并且当前逻辑处理只被执行一次;而在 Render 阶段随着业务的定制,当前处理逻辑会被执行多次,这样就保证了业务系统在处理同一个业务逻辑时能够进行定制性响应页面模版渲染。

3、AOP(Aspect Oriented Programming)模块:是 Spring 的代理模块,属于 Spring 的核心模块,它巧妙地利用了 JVM 动态代理和 CGLIB 动态代理面向过程编程,实现了业务零侵入、低耦合的效果。

为了确保 Spring 与其他 AOP 框架的互用性,Spring AOP 模块支持基于 AOP 联盟定义的 API,也就是 Aspect 模块,与 Spring IoC 模块相辅相成。其中,我们熟知且常用的事务管理就是利用 Spring AOP 模块实现的。Spring AOP 模块及 Spring 良好的架构设计及扩展性,使 Spring 可以融合基本上所有的模块及其他框架,成为真正的集大成者。

4、Aspects 模块:提供了与 AspectJ(一个成熟的功能强大的面向切面编程的框架)的集成,Aspects 扩展了 Java 语言,定义了 AOP 语法(织入点语法),持有一个专门的编译器来生成遵守 Java 字节编码规范的 Class 文件,使用字节码生成技术来实现代理。

5、Instrumentation 模块:是 Spring 对其他容器的集成及对类加载器的扩展实现,其子模块  spring-instrument-tomcat 实现了 Tomcat Instrumentation 代理功能。

6、Messaging 模块:是从 Spring 集成项目(比如 Message、MessageChannel、MessageHandler 及其他基于消息应用的基础模块)中抽象出来的,类似于基于注解的 Spring MVC 编程模块,包含一系列消息与方法的映射注解。

7、Core Container 模块(Spring 核心容器模块):它是 Spring 的基石,由 Core、Beans、Context、SpEL 四个子模块组成。

  • Core 模块和 Beans 模块:提供了框架的基础部分,包含 IoC(Inversion of Control,控制反转)和 DI(Dependency Injection,依赖注入)功能,使用 BeanFactory 基本概念来实现容器对 Bean 的管理,是所有 Spring 应用的核心。Spring本 身的运行都是由这种 Bean 的核心模型进行加载和执行的,是 Spring 其他模块的核心支撑,也是运行的根本保证。
  • Context 模块(包含 Spring-Context 和 Spring-Context-Support 两个子模块):该模块是建立在 Core 模块和 Beans 模块的坚实基础之上,并且集成了 Beans 模块的特征,增加了对国际化的支持,也支持 Java EE 特征。ApplicationContext 接口是 Context 模块的重点和焦点。Spring-Context-Support 模块支持集成第三方常用库到 Spring 应用上下文中,例如缓存(EhCache、Guava)、调度 Scheduling 框架(CommonJ、Quartz)及模板引擎(FreeMarker、Velocity)。
  • SpEL 模块:即 Spring-Expression Language,提供了强大的表达式语言来查询和操作运行时的对象。

8、Test 模块:支持通过组合 JUnit 或 TestNG 来进行单元测试和集成测试,并且提供了 Mock Object(模仿对象)方式进行测试。

Spring 的领域模型有三种,即容器领域模型、核心领域模型以及核心领域模型,下面也做下简要的说明。

  • 容器领域模型(Context 模型,或上下文模型):对 Spring 核心领域模型进行生命周期管理。
  • 核心领域模型(Bean 模型):体现 Spring 的一个重要核心理念,即一切皆 Bean,Bean 即一切。Bean 是应用运行时可执行的最小函数式(属性)单元,也可以是 Java 中的一个函数对象,更倾向于一种对象式的为某种特殊行为而生的可复用的概念,不受职责或者大小的限制。

Bean 模型是 Spring 的核心服务实体域,是应用要操作的本身,是每个线程的真正执行者,也是整个会话生命周期的管理者,还是 Spring 对外暴露的核心实体。

  • 代理领域模型(Advisor 模型):Spring 代理的执行依赖于 Bean 模型,但是 Spring 代理的生成、执行、选择都依赖于 Spring 自身定义的 Advisor 模型,只有符合 Advisor 模型的定义,才能生成 Spring 代理。

2、搭建调试环境

2.1 构建工具--Gradle

这里,使用从 Gradle 官网链接下载 gradle4.3.1,下载 binary-only 即可,并解压到指定目录。

接着,配置 Windows 环境变量--系统变量--编辑环境变量,如图所示:

保存退出,然后 CMD 验证,使用 gradle -v 命令 ,如下:

安装成功后,gradle构建工具就准备完毕,接下来去下载 Spring5 源码了。

2.2 源码的下载、编译及导入

Spring5 源码可以从 github 获取,这里,我选择的是v5.1.5.RELEASE版本,如下所示:

拉取完 spring-framework-5.1.x 工程后,找到 gradlew.bat 脚本:

直接双击执行它即可。执行完成后,会出现 build success 提示语,说明工程构建成功。

接着,使用 IDEA 打开该工程,会执行构建编译相关任务和下载必需的jar包,下载jar包的过程比较长,需要耐心等待,如下图所示:

需要注意的是,JDK 要在1.8及以上,构建工具使用前面下载的 gradle 工具,在 IDEA--settings,设置gradle选项,如下:

当工程下所有的模块右下角都会有个小蓝色图标时,说明编译成功了,至此 Spring5 源码导入完成。

搭建完成调试环境后,就可以愉快的源码调试和学习了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++]深复制与浅复制

深复制与浅复制 C中,默认的复制构造函数只能实现浅复制。 浅复制指的是在对象复制前,只对对象中的数据成员进行简单的复制 大多数情况下"浅复制"已经能很好的工作了,但是当类的数据成员中有指针类型时,浅复制只会复制指…

Gulp.Task 正解

gulp task 实现过程 今天从源码的角度分析下 gulp 中 task 的实现过程。多个 task 是如何执行??? 等等 gulp 插件分布图 其实通过上述截图可以看到,其实整个 gulp 内部什么逻辑都没有,都是由一个一个插件组成的。上述的…

Java多线程案例之单例模式(饿汉,懒汉)

目录 一、饿汉模式 二、懒汉模式 前言:单例模式是校招中最常见的设计模式之一。下面我们来谈谈其中的两个模式:懒汉,饿汉。 何为设计模式? 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多…

《Linux性能优化实战》学习笔记 Day04

06 | 锁:如何根据业务场景选择合适的锁? 原文摘抄 当你无法判断锁住的代码会执行多久时,应该首选互斥锁,互斥锁是一种独占锁。 如果你能确定被锁住的代码执行时间很短,就应该用自旋锁取代互斥锁。 对于 99% 的线程…

工信部电子标准院:龙蜥操作系统获评“优秀”

近日,工信部中国电子技术标准化研究院公布第二批通过开源项目成熟度评估的开源项目名单,龙蜥操作系统(Anolis OS)凭借在生态构建、技术创新、应用落地等方面的成熟能力与卓越表现,顺利通过评估并获得优秀贰级&#xff…

简单说说什么是真的懂一道题了

昨天写了Richard的2022年一年级入学小结后,后台有读者问我怎么算真的懂一个知识点了,今天来简单说两句,大家都知道,求123…n的和,高斯的幼年成名作。Richard同学在上中班的时候,我就给他科普过高大神的事迹…

2023牛客寒假算法基础集训营3 -- E-公平守望的灯塔(向量 简单几何)

题目如下: 示例1 输入 1 0 0 1输出 0 0说明 输出1 1也是可以的。 思路 or 题解: 我们可以迅速找到 CCC 有两个位置满足题意,但 CCC 的坐标不一定是整数,我们需要 checkcheckcheck MMM 是 ABABAB 的中点 我们可以求出来 AM→…

「栈和队列」简析

前言 前言:研究一个数据结构的时候,首先讲的是增删改查。 文章目录前言一、简介1. 结构2. 特点3. 存储二、栈1. 类比举例2. 操作3. 实现1)顺序栈(常用)a. 核心b. 要素c. 入栈d. 出栈2)链式栈三、队列1. 类比…

Spring的Aware接口讲解,内含几篇参考文章

Aware接口文章一、使用Aware与不使用Aware的效果二、ApplicationContext实例介绍Aware三、从Aware顶级接口实现自己的XXXAware一、使用Aware与不使用Aware的效果 参考文章:Spring中的aware接口 定义BeanNameAware接口 public interface BeanNameAware extends Aw…

树的应用举例——并查集和树状数组

并查集 并查集是利用森林来描述一些不相交的集合,并支持集合的合并操作和查询操作。 假设有n个元素,分为m个不相交集合,一个集合构成一棵树,同一棵树(集合)中的元素地位相等。例如下图的森林表示一个包含…

【Python】Numpy多项式详解

文章目录多项式简介构造函数与图像运算符重载常用方法多项式简介 Numpy.polynomial中封装了六种多项式类,除了常规的多项式a0a1x⋯anxna_0a_1x\cdotsa_nx^na0​a1​x⋯an​xn之外,还有五种在数学、物理中常用的正交多项式,例如Hermite多项式…

祝贺!2022 Rust中文社区线上Hackathon评审结果出炉!

完全超出预期(的优秀!)!这次黑客松共有9支队伍闯入最后的评审会。他们是:233bithttps://github.com/rustcc/hackathon2022/tree/master/233bitRust 实现的 合成材料计算器EvolutionLabhttps://github.com/rustcc/hacka…

来自AI浩的新年祝福

大家好,感谢大家这一年来的关注和支持,在新春即将到来之际,AI浩祝大家: 祝大家新的一年里生活能够像下面的兔子那样,多彩多姿! 祝愿大家,快乐常伴,笑口常开! 在新的…

chfs安装使用注意事项及如何实现http外网访问

对于分享电脑上的文件,或与手机互传文件,除了 QQ、微信还有很多专业的工具,Cute Http File Server (缩写为 chfs),就是一个免费小巧的 HTTP 文件共享服务器工具,它可以跨平台支持 Windows、Mac 和 Linux,只…

37岁被裁,但毫无遗憾:小镇出身,一穷二白,完整吃过互联网+房地产红利,现在上海有千万房产!...

有人被裁是失业,有人被裁是退休,有时候人类的悲欢真的不相通,来看看这位网友的故事:37岁,年底被裁,但是不留遗憾了。算是完整吃过一波互联网房地产红利,小镇出身,一穷二白&#xff0…

蚂蚁整改,暗藏深意

‍数据智能产业创新服务媒体——聚焦数智 改变商业互联网金融可以提升金融服务的效率和质量,促进传统产业转型升级,是资本竞相追逐的丛林,也是互联网巨头间相互争抢的战略高地。通过上市公司分拆子公司进行上市,可以获得一系列好…

C语言结构体 笔记

C语言提供结构体来管理不同类型的数据组合。C语言中的结构体类似于Java中的类。声明结构体类型定义变量名定义变量名和初始化结构体对齐结构体的大小必须是其最大成员的整数倍!(1)例如,此结构体的大小为16。因为double类型占8个字节&#xff…

聊一聊用户增长

#01 什么是用户增长 用户增长基本上会涉及生意场上的各行各业,你开个店面希望有更多的客户光顾,你做了个APP希望有更多的用户经常使用,你搭建了个电商平台希望有更多的人下单买东西。 用户增长,即以提升用户LTV为目的&#xff08…

MongoDB学习笔记【part1】概念与安装

一、NoSQL简介 NoSQL Not Only SQL,不仅仅是SQL,泛指非关系型数据库。NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。 特点:不遵循SQL标准、不支持ACID(原子、一致…

Linux常用命令——sysctl命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sysctl 时动态地修改内核的运行参数 补充说明 sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项&#xff…