目录
1. Spring框架的起源
2. Spring框架的构成
3. Spring的发展历程
4. Spring的开发环境
4.1. Maven安装与配置
(1)Maven的下载与安装
(2)配置Maven的环境变量
(3)本地仓库的配置
(4)镜像仓库的配置
(5)创建Maven项目
(6)Maven项目的结构
(7)Maven项目的配置文件
4.2. Tomca的安装与配置
(1)Tomcat下载与安装
(2)Tomcat的启动
(3)解决中文乱码问题
(4)Tomcat端口的配置
(5)Web应用的配置
4.3. 集成开发环境
(1) IntelliJ IDEA下载和安装
(2)创建Maven Web项目
(3)配置Tomcat服务器
5. 初识Spring框架
Spring框架是一个开源的Java平台,它通过提供一致的编程和配置模型,解决了企业应用开发中常见的复杂性问题。Spring的核心特性包括依赖注入(Dependency Injection, DI)和面向方面的编程(Aspect-oriented programming, AOP),它们共同提供了一种强大且灵活的方式来管理对象的依赖关系和增强对象的行为。
1. Spring框架的起源
Spring框架起源于2002年,那时Java EE和EJB正风靡一时,许多大公司都采用这些技术进行项目开发。在当时背景下,Rod Johnson认为EJB过于庞大,不是所有项目都需要这样的重型框架,应有更优的解决方案。为了证明自己的观点,Rod Johnson写了《Expert One-on-One J2EE Development without EJB》一书,书的封面如图2所示。在书中,Rod Johnson介绍了Java企业应用程序开发情况,并指出Java EE和EJB组件框架中的一些主要缺陷,Rod Johnson还提出了一个基于普通的Java类和依赖注入的更简单的解决方案,另外,他还展示了如何在不使用EJB的情况下构建高质量、可扩展性的在线预留座位系统。
图1. Expert One-on-One J2EE Development without EJB
为构建应用程序,Rod Johnson编写了超过30000行的基础结构代码,项目中的根包命名为com.interface21,这是Spring框架的前身,所以框架最初的名字叫interface21。2003 年 Rod Johnson 和同伴在此框架的基础上开发了一个全新的框架命名为Spring,Rod Johnson认为Spring 是传统J2EE新的开始,随后Spring框架的发展进入快车道。
Rod Johnson 是一位杰出的软件工程师,他以创立Spring框架而闻名。Rod Johnson 在悉尼大学获得了计算机学和音乐学的双学位,后来还获得了音乐学博士学位。Rod Johnson在软件开发领域有着深远的影响,特别是在Java社区中。2009年,VMware以4.2亿美元收购了Spring Source,2012年,Rod Johnson宣布离开Spring Source,转而成为天使投资人和多家公司的董事,继续在技术和商业领域发挥影响力。
Spring框架是由目前Pivotal团队维护的,Pivotal是一个提供云和大数据解决方案的公司,其前身是由Rob Mee于1989年创立的咨询公司Pivotal Labs。Pivotal Labs注于快速的互联网式软件开发,即敏捷编程。2012年,EMC公司收购了Pivotal Labs,并将其作为EMC的一个新部门,继续与以前的客户合作。2013年,EMC将Pivotal Labs 的核心业务分拆出去,成立了新的 Pivotal 公司,该公司的股东是 EMC 、 VMware 和通用电气。 Pivotal 公司负责维护的开源产品除了Spring及其衍生产品外,还有我们耳熟能详的Tomcat、Redis、RabbitMQ、Cloud Foundry、Greenplus和GemFire。Pivotal 公司成立之后,于 2014 年发布了 Spring Boot,2015 年发布了 Spring Cloud,2018 年 Pivotal 公司在纽约上市。
2. Spring框架的构成
Spring框架由大约20个模块组成,这些模块按照功能可分为: 核心容器(Core Container)、面向方面编程(AOP和Aspects)、设备支持(Instrumentation)、数据访问及集成(Data Access/Integration)、报文发送(Message)Web和测试(Test),如图2所示。Spring框架中的各个模块可以独立使用,也可以几个模块进行组合。
图2. Spring框架的构成
(1)核心容器(Core Container)
核心容器是由spring-beans、spring-core、spring-context和spring-expression(Spring Expression Language, SpEL)四个模块构成,提供Spring框架的基本功能。
spring-beans和spring-core是Spring框架的核心模块,它提供了控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)。BeanFactory接口是Spring框架中的核心接口,是工厂模式的实现。 BeanFactory使用IoC模式将应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。
spring-context位于核心模块之上,它扩展了BeanFactory,为其添加了Bean生命周期控制、框架事件体系以及资源加载透明化等功能。此外,它还提供了许多企业级的支持,例如,邮件访问、远程访问、任务调度等。
spring-expression是统一表达式语言(EL)的扩展模块,它可以查询和管理运行中的对象,同时也可以方便地调用对象的方法,操作数组和集合等。
(2)面向方面编程(AOP、Aspects)
Spring框架提供了面向方面的编程(AOP)能力,可以实现一些面向对象编程无法很好实现的功能,例如,将日志、事务与具体的业务逻辑解耦。AOP模块包含spring-aop、spring-aspects模块。 spring-aop是实现面向方面编程的核心模块。 spring-aspects模块集成自Aspect框架,主要为面向方面编程提供多种实现方法。
(3)仪器化支持(Instrumentation)
spring-instrument模块主要用于提供类的仪器化和类加载器的实现。类的仪器化允许Spring或其他框架在运行时修改类的字节码。spring-instrument模块提供了一个 Java 代理的实现,可以用来在加载时动态地仪器化类。这对于实现面向切面编程(AOP)等功能非常有用,可以动态地添加或改变应用程序的行为,而无需修改源代码。
(4)数据访问及集成(Data Access/Integration)
Spring自带了一组数据访问框架,集成了多种数据访问技术。例如,JDBC、MyBatis、Hibernate、Java Persistence API(JPA)等。
数据访问及集成模块包括:spring-jdbc、spring-tx、spring-orm、spring-jms和spring-oxm。spring-jdbc提供了JDBC访问支持,spring-tx实现事务控制, spring-orm提供了对象-关系映射的支持, spring-jms提供了消息的发送和接收功能, spring-oxm提供了从对象到XML映射的支持。
(5)Web
spring-web模块由spring-web、spring-webmvc、spring-websocket和spring-webflux构成,它为Web应用程序的开发提供支撑。
spring-web模块为spring提供了最基础的Web支持,其通过Servlet或者Listeners来初始化IoC容器。spring-web模块实现了Spring MVC。spring-websocket实现与Web前端的全双工通信协议。spring-webflux是一个新的非阻塞函数式Reactive Web框架,可以用来建立异步、非阻塞、事件驱动的服务。
(6)报文发送(Message)
spring-message模块是从Spring 4开始加入的一个模块,专门用于处理国际化和本地化的消息和文本。这个模块提供了一种灵活的方式来定义和管理应用中的消息,使得支持多语言环境变得更加简单。
(7)测试(Test)
spring-test模块主要用于提供支持和增强在 Spring 应用程序上进行单元测试和集成测试的功能。这个模块通过提供一系列的实用工具和注解来简化测试过程,使得开发者能够更加高效地编写和执行测试用例。
3. Spring的发展历程
Spring自2002年由Rod Johnson提出概念以来,经历了多个重要的发展阶段,逐渐成为Java开发中最受欢迎的框架之一。Spring框架的主要发展历程如下:
- 2003年:Spring框架首次公开发布,版本为0.9。这个版本包括了核心容器、依赖注入、面向切面编程等基础功能。
- 2004年:发布Spring 1.0正式版,随后不久推出1.2版本,增加了对MVC框架的支持。
- 2006年:Spring 2.0发布,引入了基于XML的配置元数据支持和简化的XML命名空间。
- 2007年:Spring 2.5发布,改进了对注解驱动开发的支持,引入了Spring Web Flow。
- 2009年:Spring 3.0发布,增加了对Java 5以上版本的支持,引入了注解驱动的开发和Java EE 6的支持。
- 2013年:Spring 4.0发布,全面支持Java 8,增强了对WebSocket和REST APIs的支持。
- 2014年:Spring Boot 1.0发布,目的是简化新Spring应用的引导和开发过程。Spring Boot提供了大量自动配置的功能,极大地简化了项目配置和依赖管理。
- 2015年:Spring Cloud项目启动,旨在提供在云平台上构建和部署微服务的工具和支持。
- 2017年:Spring 5.0发布,引入了反应式编程模型,支持响应式APIs,增强了在异步和事件驱动环境下的性能。
- 2019年:Spring Boot 2.2发布,进一步增强了对微服务架构和云原生应用的支持。
- 2021年:Spring Boot 2.5发布,持续优化和扩展功能,提升开发体验和性能。
- 2022年:Spring 6.0发布,该版本基于 Java 17+,与最新的 Java EE 标准保持一致,提供了更好的兼容性和扩展性。
Spring框架的发展不仅跟随了技术潮流,如从单体应用到微服务架构的转变,还积极引入新技术,如响应式编程和云原生支持,保持了其在Java开发社区中的领导地位。通过不断的迭代和改进,Spring使得Java开发更加高效、简洁和强大。在这个过程中,Spring生态系统也不断壮大。许多基于Spring的项目如Spring Security、Spring Data、Spring Cloud等都成为了Java开发中不可或缺的一部分。Spring框架的不断发展和完善,使其能够持续满足企业级Java应用开发的需求,并保持在技术创新的前沿。
4. Spring的开发环境
Spring框架是采用Java语言开发,spring 5.0对Java要求的最低版本是Java 8。关于Java运行环境的安装与配置请阅读文章:开发Java应用程序,在此不做赘述。下面介绍项目管理工具Maven、Web服务器Tomcat以及Java集成开发环境(IDE)的安装与配置。
4.1. Maven安装与配置
Maven是跨平台的项目管理工具,主要服务于Java平台的项目构建、依赖管理、项目信息管理。Maven是Apache下的一个开源项目,它包含了对象模型、标准集合、项目生命周期、依赖管理系统和用来运行定义在生命周期阶段的插件目标的逻辑。
(1)Maven的下载与安装
打开Maven官方下载网址(https://maven.apache.org/download.cgi), 选择下载二进制归档zip文件(Binary zip archive):apache-maven-3.9.6-bin.zip,如图3所示。
图3. Maven的下载页面
将下载的apache-maven-3.9.6-bin.zip文件解压缩到无中文和空格的路径下,这里选择D:\apache-maven-3.9.6,解压缩后的目录结构如图4所示。
图4. Maven的目录结构
(2)配置Maven的环境变量
首先新建环境变量MAVEN_HOME,将其值设置为: D:\apache-maven-3.9.6,然后,编辑环境变量Path,将%MAVEN_HOME%\bin加入到Path中。
图5. MAVEN环境变量的定义
在命令行方式下输入mvn-version命令,检测maven是否安装成功,如果输出下图的内容,则说明Maven安装成功。
(3)本地仓库的配置
配置完Maven的环境变量之后,还需要修改本地Maven仓库的地址。Maven从远程仓库下载依赖包会存储在本地仓库中。需要手动修改配置文件setting.xml来配置本地仓库的地址,setting.xml文件位于Maven安装目录的conf文件夹下,例如,在面向的实例中,该文件位于D:\apache-maven-3.9.6\conf目录中。
打开settings.xml文件,看到文件的第53行内容,将53行复制并粘贴到55行,如下图所示。
将localRepository标签内容换成自己的本地仓库地址。Maven推荐本地仓库地址设置为 :${user.home}/.m2/repository(见52行),其中,user.home为用户的主目录。例如,在Windows系统下,user.home的目录为C:\Users\fcmeng,则Maven的本地仓库地址为:C:\Users\fcmeng\.m2\repository,如下图所示。
如果用户机器的C盘的空间有限,也可以将Maven的本地仓库地址改为其它地址。
(4)镜像仓库的配置
Maven默认的官方镜像仓库是海外的,在国内下载速度非常慢,推荐使用阿里云提供的Maven镜像仓库,这样可以加快依赖包的下载速度和稳定性。
可以添加阿里云的镜像到setting.xml文件中。首先,在setting.xml文件中找到mirrors节点,在其下添加mirror子节点,节点信息如下:
<mirror> <id>alimaven</id> <mirrorOf>center</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> |
添加上述子节点后的setting.xml文件内容如下:
(5)创建Maven项目
利用maven内置插件Archetype的generate任务可以创建一个Java项目骨架。命令如下:
mvn archetype:generate -DgroupId={project-packaging} -DartifactId={project-name} -
DarchetypeArtifactId={ArchetypeId} -DinteractiveMode=false
其中,
- archetype是插件名称, generate是插件的一个任务,一个插件可以有很多任务,这里仅是产生骨架任务;
- -DgrounpId:组织标识(包名);
- -DartifactId:项目名称;
- -DarchetypeArtifactId:指定ArchetypeId,即骨架类型;
- -DinteractiveMode:是否使用交互模式。
常用的项目骨架:
- maven-archetype-quickstart:创建Java一般项目
- maven-archetype-webapp:创建Java Web项目
集成开发环境中创建Maven项目也是调用maven内置插件Archetype来完成的。
(6)Maven项目的结构
Maven项目有约定的目录结构,每个目录都有自己的含义,如图6所示。
图6. Maven项目的结构
(7)Maven项目的配置文件
pom.xml是Maven项目的核心配置文件。项目本身的描述、项目依赖库、项目构建配置等与构建过程相关的一些设置都在这个文件中进行配置。
pom的含义是项目对象模型(Project object model),其内容及其含义如图7所示。
图7. pom.xml文件
可以在maven网站上查找并添加项目依赖的JAR包,Maven网站地址:https://mvnrepository.com/,其首页如下图所示。
图8. Maven网站
4.2. Tomca的安装与配置
Tomcat是Apache组织的Jakarta项目中的一个重要子项目,它是Sun公司(已被Oracle收购)推荐运行Servlet和JSP的容器(引擎),其源代码是完全公开的。Tomcat不仅具有Web服务器的基本功能,还提供了数据库连接池等许多通用组件功能。
(1)Tomcat下载与安装
Tomcat的版本不断更新,我们选择Windows 64位系统下10.1.23版的二进制归档文件:apache-tomcat-10.1.23-windows-x64.zip,
下载地址为:https://tomcat.apache.org/download-10.cgi,如图9所示。
图9. Tomcat的下载页面
将下载的zip文件戒烟所的安装目录,这里为D:\tomcat\apache-tomcat-10.1.23,解压缩后的目录结构如下图所示。
图10. Tomcat的目录结构
各个目录的含义如下:
- bin:用于存放Tomcat的可执行文件和脚本文件。
- conf:用于存放Tomcat的各种配置文件,如web.xml、server.xml。
- lib:用于存放Tomcat服务器和所有Web应用程序需要访问的JAR文件。
- logs:用于存放Tomcat的日志文件。
- temp:用于存放Tomcat运行时产生的临时文件。
- webapps:Web应用程序的主要发布目录,通常要将发布的应用程序放到这个目录下。
- work:Tomcat的工作目录,JSP编译生成的Servlet源文件和字节码文件放到这个目录下。
(2)Tomcat的启动
进图Tomcat安装目录的bin文件夹下,用鼠标双击startup.bat文件,便会启动Tomcat服务器,此时可以在命令行看到一些启动信息,如图11所示。
图11. Tomcat启动界面
在启动Tomcat的过程,可能会遇到一种情况,即双击bin目录中的startup.bat脚本文件时,命令行窗口一闪而过。这时可以进入命令窗口,在该窗口执行startup.bat命令,就会看到错误信息显示在该窗口中。出现上述情况的主要问题可能是JAVA_HOME环境变量配置不正确。这是因为Tomcat服务器是由Java语言开发的,它在运行时需要根据JAVA_HOME环境变量来获取JRE的安装位置,从而利用Java虚拟机来运行Tomcat。要解决这个问题只需将JAVA_HOME环境变量配置成JDK的安装目录。
Tomcat启动后,在浏览器的地址栏中输入http://localhost:8080或者http://127.0.0.1:8080,访问Tomcat服务器,如果浏览器中出现如图12显示的界面,则说明Tomcat服务器安装成功。
图12. Tomcat启动首页
(3)解决中文乱码问题
Tomcat产生中文乱码的主要原因是编码与解码的方式不一致,可以通过如下方式解决。
- 打开tomcat的/conf/server.xml,在Connerctor标签下给它增加UTF-8编码方式(第74行):
- 打开tomcat的\conf\logging.properties,将日志的编码格式由UTF-8改为GBK(第51行):
(4)Tomcat端口的配置
8080是Tomcat服务器默认占用的端口,可以通过修改Tomcat服务器安装目录中conf文件夹下的主配置文件server.xml来更改端口号。打开server.xml文件,找到如下内容:
将其中的port=“8080”更改为新的端口号,并重新启动Tomcat服务器即可,例如,将8080更改为9090等。
如果Tomcat服务器所在的计算机没有启动占用80端口的其他网络程序,也可以将Tomcat服务器的端口设置为80,这样用户在访问Tomcat服务器时可以省略端口号,例如,http://localhost/ 。
(5)Web应用的配置
在Web服务器上运行的Web资源都是以Web应用形式呈现的,所谓Web应用就是多个Web资源的集合,Web应用通常也称为Web应用程序或Web工程。一个Web应用由多个Web资源或其他文件组成,其中包括HTML文件、CSS文件、JS文件、动态Web页面、Java程序、支持JAR包、配置文件等。开发人员在开发Web应用时,应按照一定的目录结构来存放这些文件,否则,在把Web应用交给Web服务器管理时,不仅可能会使Web应用无法访问,还会导致Web服务器启动报错。
Tomcat服务器安装目录的webapps目录下的任何一个子目录都可以作为一个Web应用目录。例如,在webapps下新建myweb子目录,那么myweb就成为一个Web应用目录,如果将web1.html保存到myweb中,那么在浏览器中输入:http://localhost:8080/myweb/web1.html,就可以访问web1.html页面。
在Tomcat中部署Web应用主要有四种方式:
- 方式一:将web项目打包为WAR文件后拷贝到webapps目录中;
- 方式二:将Web应用文件夹复制到Tomcat安装目录下的webapps文件夹中;
- 方式三:打开Tomcat安装路径下的conf文件夹下的server.xml文件,在<Host></Host>元素中添加<Context>元素,例如,要配置D:\myWeb文件夹下的Web应用myweb1可以使用以下代码:<Context path=“/” docBase=“D:/myWeb/myweb1” reloadable=“true” >。
- 方式四:在conf\Catalina\localhost目录下添加xml配置文件,任意命名只要和当前文件夹中的文件名不重复即可。
4.3. 集成开发环境
目前,业界最常用的Java IDE工具是Eclipse和IntelliJ IDEA。Eclipse是开源免费的,IntelliJ IDEA提供了两个版本:旗舰版(Ultimate)和社区版(Community),其中,Ultimate是商业收费的,Community是免费的。对于在校的教师和学生,可以申请免费的IntelliJ IDEA Ultimate版本作为教学和学习使用。在这里,我们介绍如何利用IntelliJ IDEA Community创建和管理Maven项目。
(1) IntelliJ IDEA下载和安装
IntelliJ IDEA的下载网址是:https://www.jetbrains.com/idea/download,我们选择IntelliJ IDEA Community Edition进行安装文件的下载,如图13所示。
图13. IntelliJ IDEA 下载页面
下载完成后单击安装文件进行安装,安装结束后需要重启计算机。IntelliJ IDEA的启动界面如图14所示,默认的是黑色主题“Darclus”,在“Customize”选项中可以修改颜色主题。
图14. IntelliJ IDEA的启动界面
(2)创建Maven Web项目
点击启动界面中“New Project”按钮,进入创建项目界面,如图15所示,我们选择“Maven Archetypr”选项创建Maven项目。项目的名称为“mywebapp”,项目的位置是“E:\idea-workspace”目录,IDEA能够检测到机器安装的JDK,本机安装的JDK版本是20.0.2,在Archetype下拉列表中选择Maven项目的类型,在这里,我们选择“maven-archetype-webapp”,版本为1.0,点击“create”按钮开始创建Maven Web项目。由于需要从远程Maven仓库下载文件,所以创建过程会花费一段时间,请耐心等待!
图15. 创建项目界面
自动生成的项目结构如图16所示。
图16. Maven Web项目结构
选择“File | Settings”菜单,进入Setting是界面,如图17所示,点击左侧树结构中的“Build, Excution, Deployent | Build Tools | Maven”节点,右侧显示Maven的配置信息。在Maven home path的下拉列表中,除了IDEA内置的Maven外,还检测到了用户安装的Maven。在这里,我们选择IDEA内置的Maven。
图17. Maven设置界面
(3)配置Tomcat服务器
IDEA Community版本没有内置的Tomcat服务器插件,需要安装相应的插件。在Setting界面中点击左侧“Plugins”节点,进入插件安装界面,如图18所示,在查询栏中输入“tomcat”,选择Smart Tomcat进行安装。
选择“Run | Edit Configurations”菜单,进入Run/Debug Configurations界面,点击“+”按钮,选择Smart Tomcat选项配置Tomcat,如图18所示,在Tomcat server的下拉列表中选择已安装的Tomcat的目录,在Catalina base中配置在Maven Web项目所使用的Tomcat的存放地址,在Deployment directory中配置Maven Web项目的Web应用目录,点击“OK”按钮保存Tomcat配置。
图18. 配置Tomcat
启动Tomcat服务器,在浏览器中输入:http://localhost:8080/mywebapp,显示如下图所示界面,这说明Tomcat服务器配置成功。
图19. Maven Web项目默认首页
5. 初识Spring框架
在pom.xml文件中增加如下依赖,然后,在项目上右击,在弹出的快捷菜单中选择Maven |Reload project命令更新项目。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.25.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.25.RELEASE</version> </dependency> |
项目更新后,增加了如下了一些Spring依赖包。
在项目中创建包com.my,在包com.my下创建类Hello和Main,定义如下:
package com.my;
import org.springframework.stereotype.Component;@Component
public class Hello {public void print(){System.out.println("Hello World!");}
}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com.my")
public class Main {public static void main(String[] args){AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(Main.class);Hello hello=context.getBean(Hello.class);hello.print();}
}
运行类Main,在控制台中输出如下信息:
Hello World! |
代码说明:
- 使用注解@Component声明的类是由Spring Ioc容器管理的一个Bean。
- 使用注解@Configuration声明的类是Spring框架中的一个配置类。
- 注解@ComponentScan("com.my")表示Spring框架自动扫描com.my包及其子包下所有使用注解@Service、@Component、@Repository和@Controller的声明的类,并将其注册为Bean。
- AnnotationConigApplicationContext是Spring 框架中的一个类,用于基于 Java 注解的配置来启动 Spring 容器。该类是接口ApplicationContext的一个实现类,它允许从一个或多个基于 Java 的配置类中加载Spring应用上下文。