Spring基础知识(1)- Spring简介、Spring体系结构和开发环境配置
注:开始阅读 Spring 基础知识系列文章之前,读者应该已经掌握了 Java 基础知识。另外,本系列文章中的所有实例都是使用 IntelliJ IDEA + Apache Maven 配置和编译的,所以还需要对 IntelliJ IDEA 和 Apache Maven 有基本的了解。
1. Spring 简介
Spring 是 Java EE (Java Platform Enterprise Edition,Java EE 是 J2EE的一个新的名称,) 编程领域的一款轻量级的开源框架,由被称为 “Spring 之父” 的 Rod Johnson 于 2002 年提出并创立,它的目标就是要简化 Java 企业级应用程序的开发难度和周期。
Spring 自诞生以来备受青睐,一直被广大开发人员作为 Java 企业级应用程序开发的首选。时至今日,Spring 俨然成为了 Java EE 代名词,成为了构建 Java EE 应用的事实标准。
1) Spring 的诞生与发展
早期的 J2EE(Java EE 平台)推崇以 EJB 为核心的开发方式,但这种开发方式在实际的开发过程中存在种种弊端,例如使用复杂、代码臃肿、代码侵入性强、开发周期长、移植难度大等。
Rod Johnson 在其 2002 年编著的畅销书《Expert One-on-One J2EE Design and Development》中,针对 EJB 各种臃肿的结构进行了逐一的分析和否定,并分别以更加简洁的方式进行了替换。
在这本书中,Rod Johnson 通过一个包含 3 万行代码的附件,展示了如何在不使用 EJB 的情况下构建一个高质量、可扩展的 Java 应用程序。在这个附件中,Rod Johnson 编写了上万行基础结构代码,其中包含了许多可重用的 Java 接口和类,例如 ApplicationContext、BeanFactory 等。这些类的根包被命名为 com.interface21,含义为:这是提供给 21 世纪的一个参考。
这本书影响甚远,后来 Rod Johnson 将 com.interface21 的代码开源,并把这个新框架并命名为“Spring”,含义为:Spring 像一缕春风一样,扫平传统 J2EE 的寒冬。
2003 年 2 月,Spring 0.9 版本发布,它采用了 Apache 2.0 开源协议;2004 年 4 月,Spring 1.0 版本正式发布。到目前为止,Spring 已经步入到了第 5 个大版本,也就是我们常说的 Spring 5。
2) Spring 的狭义和广义
在不同的语境中,Spring 所代表的含义是不同的。下面我们就分别从“广义”和“狭义”两个角度,对 Spring 进行介绍。
(1) 广义的 Spring:Spring 技术栈
广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。
经过十多年的发展,Spring 已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项目(模块)组成的成熟技术,例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子项目的基础。
项目 | 描述 |
Spring Data | Spring提供的数据访问模块,对 JDBC 和 ORM 提供了很好的支持。通过它,开发人员可以使用一种相对统一的方式,来访问位于不同类型数据库中的数据。 |
Spring Batch | 专门针对企业级系统中的日常批处理任务的轻量级框架,能够帮助开发人员方便的开发出健壮、高效的批处理应用程序。 |
Spring Security | 前身为 Acegi,是 Spring 中较成熟的子模块之一。它是一款可以定制化的身份验证和访问控制框架。 |
Spring MVC | 基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。 |
Spring Mobile | 是对 Spring MVC 的扩展,用来简化移动端 Web 应用的开发。 |
Spring Boot | 是 Spring 团队提供的全新框架,它为 Spring 以及第三方库一些开箱即用的配置,可以简化 Spring 应用的搭建及开发过程。 |
Spring Cloud | 基于 Spring Boot 实现的微服务框架。它将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装的一套简单易懂、易部署和易维护的分布式系统开发工具包。 |
(2) 狭义的 Spring:Spring Framework
狭义的 Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。
Spring 框架是一个分层的、面向切面的 Java 应用程序的一站式轻量级解决方案,它是 Spring 技术栈的核心和基础,是为了解决企业级应用开发的复杂性而创建的。
Spring 有两个核心部分: IoC 和 AOP。
项目 | 描述 |
IoC | Inverse of Control 的简写,译为“控制反转”,指把创建对象过程交给 Spring 进行管理。 |
AOP | Aspect Oriented Programming 的简写,译为“面向切面编程”。 |
AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP 还解决一些系统层面上的问题,比如日志、事务、权限等。
(3) Spring Framework 的特点
a) 方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。
b) 方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
c) 降低 Java EE API 的使用难度
Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低。
d) 方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
e) AOP 编程的支持
Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
f) 声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。
2. Spring 体系结构
1) Core Container(Spring 的核心容器)
模块 | 描述 |
Beans 模块 | 提供了框架的基础部分,包括控制反转和依赖注入。 |
Core 核心模块 | 封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。 |
Context 上下文模块 | 建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。 |
SpEL 模块 | 提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。 |
2) AOP、Aspects、Instrumentation 和 Messaging
模块 | 描述 |
AOP 模块 | 提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。 |
Aspects 模块 | 提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。 |
Instrumentation 模块 | 提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。 |
Messaging 模块 | Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。 |
3) Data Access/Integration(数据访问/集成)
模块 | 描述 |
JDBC 模块 | 提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。 |
ORM 模块 | 提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。 |
OXM 模块 | 提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。 |
JMS 模块 | 指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。 |
Transactions 事务模块 | 支持编程和声明式事务管理。 |
4) Web 模块
模块 | 描述 |
Web 模块 | 提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。 |
Servlet 模块 | 提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。 |
WebSocket 模块 | 提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。 |
Portlet 模块 | 提供了在 Portlet 环境中使用 MVC 实现,类似 Web-Servlet 模块的功能。 |
5) Test 模块
Test 模块:Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。
3. Spring 开发环境配置
1) 系统要求
(1) 基础要求
硬件:台式机或笔记本电脑,内存在 2G 以上,CPU 尽量 I3 以上(或其它CPU同等配置)
操作系统:Windows XP/7/8/10/11、MacOS或Linux等桌面系统(达到WinXP性能以上)
代码编辑器:Visual Studio Code,Sublime Text,Ultra Edit,Notepad 等(有些需要付费)。
Java JDK: 8 以上版本
(2) 扩展要求(提高开发效率,降低开发难度)
a) Apache Maven:
Apache Maven 是一款基于 Java 平台的项目管理和整合工具,它将项目的开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需要做一些简单的配置,Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。
官方网址:https://maven.apache.org/
b) Eclipse IDE for Enterprise Java and Web Developers:
面向使用 Java 和 Web 应用程序的开发人员的工具,包括Java IDE、JavaScript工具、TypeScript、JavaServer 页面和界面、Yaml、Markdown、Web服务、JPA和数据工具、Maven和Gradle、Git等。
官方网址:https://www.eclipse.org/
c) IntelliJ IDEA Community Edition (简称 IDEA,Ultimate版是付费的):
IntelliJ IDEA Community Edition 是 IntelliJ IDEA的一个开源版本。 支持Java、XML和Groovy代码,支持 Ant和Maven 等构建工具,集成JUnit和TestNG测试框架,集成CVS、Subversion和git版本控制系统。
官方网址:https://www.jetbrains.com/idea/
*注:本文主要讨论 Maven + IDEA 组合的 Spring 开发环境。
2) Windows 下配置环境
Windows版本 : Windows 10 Home (20H2)
(1) Java/JDK 安装
a) 下载 JDK
https://www.oracle.com/java/technologies/downloads/
下载 Windows 版的 Java 8+ 的 *.exe 文件,默认安装后,假设安装目录是 C:\Program Files (x86)\Java\jdk8.0.1。
b) 配置环境变量
右击“我的电脑” → “属性” → “高级系统设置” → “高级” → “环境变量”
新建系统变量(点击“系统变量”下方的“新建”按钮,填写变量名与变量值,点击“确定”)
JAVA_HOME = C:\Program Files (x86)\Java\jdk8.0.1
CLASSPATH = .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
编辑系统变量 Path (PATH)
Path = ... ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
查看Java版本,运行如下命令:
c:\> java -version
(2) Apache Maven 配置
https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip
下载后解压缩,无需安装,只需配置。假设 Maven 相关的目录如下:
Maven 目录: C:\Applications\java\apache-maven-3.8.1
本地 Maven 仓库: C:\Applications\java\maven-repository
a) 配置环境变量
右击“我的电脑” → “属性” → “高级系统设置” → “高级” → “环境变量”
新建系统变量(点击“系统变量”下方的“新建”按钮,填写变量名与变量值,点击“确定”)
MAVEN_HOME = C:\Applications\java\apache-maven-3.8.1
编辑系统变量 Path (PATH)
Path = ... ;%MAVEN_HOME%\bin;
b) 修改成阿里源
修改 C:\Applications\java\apache-maven-3.8.1\conf\settings.xml
...
# 修改本地仓库路径
<localRepository>C:\Applications\java\maven-repository</localRepository>
...
# 修改成阿里源
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(3) IntelliJ IDEA Community Edition 安装
https://www.jetbrains.com/idea/download/
下载的 *.exe 文件,默认安装后,运行。
配置 Maven:
菜单 File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven
Maven home path: C:\Applications\java\apache-maven-3.8.1
User settings file: C:\Applications\java\apache-maven-3.8.1\conf\settings.xml
Local repository: C:\Applications\java\maven-repository
(4) XAMPP for Windows 安装
https://www.apachefriends.org/download.html
本文安装版本 7.4.25,用到 XAMPP 的如下功能:
+ Apache 2.4.51
+ MariaDB 10.4.21 (MySQL的分支)
+ PHP 7.4.25 (VC15 X86 64bit thread safe) + PEAR
+ phpMyAdmin 5.1.1
3) macOS 下配置环境
macOS版本 : macOS High Sierra (Version: 10.13.6)
(1) Java/JDK 安装
a) 下载 JDK
https://www.oracle.com/java/technologies/downloads/
下载 macOS 版 Java 8+ 的 *.dmg 文件,双击安装。
运行 "/usr/libexec/java_home -V" 查看 Java 目录,查到的目录如下:
/Users/xxx/Library/Java/JavaVirtualMachines/corretto-1.8.0_302/Contents/Home
*注:路径中的 xxx 是当前的macOS用户名,下同。
b) 设置 JAVA_HOME
修改系统配置文件 /etc/profile (也可修改当前用户的 ~/.bash_profile,下同)
$ sudo vi /etc/profile
JAVA_HOME=/Users/xxx/Library/Java/JavaVirtualMachines/corretto-1.8.0_302/Contents/Home
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
$ source /etc/profile
$ echo $JAVA_HOME
查看Java版本,运行如下命令:
$ java -version
(2) Apache Maven 配置
下载:https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
下载后解压缩,无需安装,只需配置。假设 Maven 相关的目录如下:
Maven 目录: /Users/xxx/Applications/Java/apache-maven-3.8.1
本地 Maven 仓库: /Users/xxx/Applications/maven-repository
a) 配置环境变量
修改系统配置文件 /etc/profile
$ sudo vim /etc/profile
...
MAVEN_HOME=/Users/xxx/Applications/Java/apache-maven-3.8.1
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
export JAVA_HOME JRE_HOME MAVEN_HOME CLASS_PATH PATH
$ source /etc/profile
$ echo $MAVEN_HOME
b) 修改成阿里源
修改 /Users/xxx/Applications/Java/apache-maven-3.8.1/conf/settings.xml
...
# 修改本地仓库路径
<localRepository>/Users/xxx/Applications/maven-repository</localRepository>
...
# 修改成阿里源
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(3) IntelliJ IDEA Community Edition 安装
https://www.jetbrains.com/idea/download/
下载的 *.dmg 文件,默认安装后,运行。
配置 Maven:
IntelliJ IDEA -> Preferences -> Build, Execution, Deployment -> Build Tools -> Maven
Maven home path: /Users/xxx/Applications/Java/apache-maven-3.8.1
User settings file: /Users/xxx/Applications/Java/apache-maven-3.8.1/conf/settings.xml
Local repository: /Users/xxx/Applications/maven-repository
(4) XAMPP for macOS 安装
https://www.apachefriends.org/download.html
本文安装版本 7.4.25,用到 XAMPP 的如下功能:
+ Apache 2.4.51
+ MariaDB 10.4.21 (MySQL的分支)
+ PHP 7.4.25 (VC15 X86 64bit thread safe) + PEAR
+ phpMyAdmin 5.1.1
4) Linux 下配置环境
Linux版本:Ubuntu 18.04
(1) Java/JDK 安装
a) 安装 Java
# Ubuntu 18.04 使用如下命令
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
# CentOS 7.9 使用如下命令
$ yum search java | grep jdk # 查看可安装的 Java
$ sudo yum install -y java-1.8.0-openjdk-devel.x86_64
$ java -version
openjdk version "1.8.0_275"
OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~18.04-b01)
OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)
$ update-alternatives --config java
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
注:update-alternatives --config java 命令的输出结果,显示 java 的所在目录是 /usr/lib/jvm/java-8-openjdk-amd64 。
b) 设置 JAVA_HOME
修改系统配置文件 /etc/profile (也可修改当前用户的 ~/.bash_profile,下同)
$ sudo vi /etc/profile
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
$ source /etc/profile
$ echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64
(2) Apache Maven 配置
参考 macOS 下 Maven 配置
(3) IntelliJ IDEA Community Edition
略
(4) XAMPP for Linux
略
4. Spring 相关的网站
Spring:https://spring.io/
Spring Initializr: https://start.spring.io/
Maven:https://maven.apache.org/
Maven Repository:https://mvnrepository.com/
Java Standard Edition 8 API:https://docs.oracle.com/javase/8/docs/api/
Tomcat:https://tomcat.apache.org/
JMeter:https://jmeter.apache.org/
本系列文章资料参考来源:
1. http://c.biancheng.net/spring/
2. https://www.w3cschool.cn/wkspring/
3. http://www.tutorialspoint.com/spring/spring_overview.htm
4. https://docs.spring.io/spring-framework/docs/4.3.9.RELEASE/spring-framework-reference/html/