搭建Spring开发环境
在以前的项目开发中要使用Spring框架,需要开发者从官网下载所需版本的Spring jar包到本地项目中,然后再构建依赖,并且后续每新建一个项目都需要复制一份依赖到新项目中,然后再开始进行项目开发。自从Maven出现后,这种情况发生了改变,开发者只需要添加Spring依赖坐标就能自动下载所需要的jar包到项目中,改变了以前手动复制jar的过程,提高了开发效率。
Maven的优势和标准目录结构
Maven是一个跨平台地进行项目管理和构建综合工具,能让开发者更方便地管理和构建项目。Maven的最大特色是管理项目依赖,添加依赖后,它能够自动从中央仓库下载项目需要的jar包,从而构建项目依赖的jar包。Maven可以自动完成项目基础构建的管理,它使用的是标准的目录结构和默认的构建生命周期。当有多个开发者协作开发时,Maven可以设置按照约定快速完成项目的配置工作。
使用Maven进行项目开发有4个优点:
对依赖项目的所有jar包可以统一管理,包括jar包的位置和版本的管理。
快速构建项目,Web项目能够打成war包或jar包,只需要添加依赖的坐标就能自动构建项目。
Maven是纯Java开发,支持跨平台。
提高了开发效率,能够自动构建和测试项目。
使用Maven开发项目约定了一个标准目录结构,即约定优于配置的原则。
标准的Maven目录结构如图1.2所示。
图1.2 Maven项目结构
其中,项目名为springdemo,src是存放源码的目录,Java源代码文件存放在src/main/java下,项目配置文件存放在src/main/resources下,Java单元测试文件存放在test/java下,项目的所有依赖都存放在pom.xml文件中,编译后的文件存放在target目录下。当使用Maven进行开发时,按照以上约定,相应的文件可以放置在相应的位置也可以放在其他目录下。当放在其他目录下时需要配置说明。按照约定俗成的习惯来开发,这就是约定优于配置的原则。
说明:在创建项目中的类和配置文件时,如无特殊说明,都是按照上述标准目录来存放的。
在Maven的使用过程中有两个ID非常重要,分别是groupId和artifactId,它们表示jar的组织ID和名字ID。
groupId是组织域名的倒写。例如,百度的域名为baidu.com,在开发过程中groupId为com.baidu。
artifactId是项目名称。例如,本项目是用于用户服务的,artifactId就可以设置为user-service。
项目开发中会涉及版本的迭代,如果一个jar的groupId和artifactId一样,但是版本(version)不同,那么它们就是不同的jar。世界上众多依赖Maven构建的项目就是使用groupId、artifactId和version来决定jar的唯一性,这三者组成了一个Maven坐标。常见的Maven坐标的配置文件如下(外层包裹dependency标签):
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
</dependency>
在开发时如果需要添加相关的依赖,只需要确定groupId、artifactId和version,Maven会自动从中央仓库中把所需的jar包下载到本地。例如当进行Spring开发时,需要把Spring的core包引入项目中,只要在pom.xml中添加spring-core 5.3.8版本的依赖,即可自动完成jar的下载和构建。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
</dependency
Maven的下载和安装
本书使用的Maven版本是3.5.2,请读者自行将Maven(二进制源的压缩包)下载到本地。该版本的Maven需要的JDK版本是1.8+,建议读者安装完JDK后再安装Maven。下载后的Maven需要配置环境变量。
(1)把下载的Maven压缩包解压到目录D:\soft下。
(2)配置Window环境变量,在Path变量中添加D:\soft\apache-maven-3.5.2\bin完成Maven环境变量的配置。
(3)配置完成后,在控制台上使用mvn -v命令验证本地的Maven是否配置成功,如果显示如图1.3所示的提示,则表示Maven已经配置成功了。
图1.3 Maven安装命令验证
mvn -v是查看Maven版本的命令,Maven的使用依赖于各种命令,表1.1列举了开发中常用的Maven命令,这些命令还可以组合使用。例如,清理编译后的文件再打包项目,可以使用命令mvn clean package。
因为从国外的Maven中央仓库下载jar包速度较慢,为了在开发中更快地下载所需的jar包,建议读者在配置完成Maven之后再配置国内的Maven仓库镜像。本书推荐使用华为云的Maven仓库或阿里云的Maven仓库,方法如下:
(1)打开Maven安装目录下的conf目录,使用文本编辑工具打开settings.xml文件。
(2)在mirrors节点下配置仓库的地址。下面是华为云和阿里云的仓库地址,读者可任选其一完成配置。
<mirrors>
<!-- 阿里云的仓库地址-->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<!-- 华为云的仓库地址-->
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<name>华为云公共仓库</name>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</mirror>
</mirrors>
总体来说,Maven起到了简化开发和标准化项目开发的作用,实现了企业项目的轻松构建。Maven的安装是下一步操作的基础,请读者务必安装。
搭建Eclipse开发环境
当使用Java进行项目开发时,估计读者想到的第一个IDE是Eclipse(使用IDEA的请跳转到下一小节)。请读者自行从Eclipse的官网下载并安装Eclipse,具体步骤不再赘述。本小节使用的Eclipse版本是Version:2020-09 (4.17.0)。
将下载文件解压后,打开eclipse.exe即可启动Eclipse。Eclipse启动后,配置Eclipse工作空间的编码为UTF-8,配置步骤如图1.4所示,本地Maven目录和配置文件的位置,如图1.5所示。
图1.4 Eclipse的编码设置
图1.5 Eclipse的Maven的配置
最后单击Apply and Close按钮即完成Eclipse的配置。下面简单介绍如何使用Eclipse。
使用Eclipse新建一个Maven项目。选择File | new Project | MavenProject命令,弹出New Project对话框,如图1.6所示。单击Next按钮,在弹出的对话框中选择创建一个简单的项目,然后设定group id和artifact id分别为com.onyx和spring-demo,最后单击Finish按钮完成项目的创建。
图1.6 使用Eclipse新建Maven项目
最终创建完成的项目目录如图1.7所示。下一步就是在pom.xml中添加依赖,正式开始项目开发。
图1.7 Eclipse中的Maven项目目录
搭建IntelliJ IDEA开发环境
在Java的企业级开发中,常用的IDE还有IDEA。本书使用的IntelliJIDEA的版本为IntelliJ IDEA 2018.3.6,请读者自行下载安装。安装完成后必须先进行配置。打开IntelliJ IDEA,选择File | Settings命令,弹出配置页面,在其中配置本地Maven,设置Maven的所在目录和配置文件位置,如图1.8所示。
图1.8 IntelliJ IDEA Maven设置
注意:User settings file选项配置的是conf下的settings.xml。Localrepository选项可选择本地仓库,也可以新建一个目录。
完成IntelliJ IDEA的Maven设置后,和Eclipse一样新建一个Maven项目,选择File | new Project命令,在弹出的对话框中选择使用Maven作为构建工具,然后单击Next按钮弹出项目名称对话框,在其中设定groupId和artifactId分别为com.onyx和spring-demo,然后单击Finish按钮。创建完成后的目录结构和Eclipse类似,如图1.9所示,IDEA和Eclip都实现了Maven的约定,不同的工具创建出来的Maven目录结构均一致。
图1.9 IntelliJ IDEA的Maven项目结构
至此完成了IDEA项目的创建。在项目开发中建议使用IDEA,这样会帮助开发者节省大量的构建时间,而且可以避免一些奇怪的项目构建问题。
实战:第一个Hello World项目
本书中的所有代码都使用IntelliJ IDEA完成,具体步骤如下:
(1)打开IntelliJ IDEA新建一个项目。选择File | new Project命令,在弹出的对话框中,选择Maven选项,然后单击Next按钮,在进入的对话框中输入groupId和artifactId作为com.onyx和springdemo,然后单击Finish按钮,创建第一个Hello Word项目springdemo。
(2)在pom.xml中添加spring-context依赖,代码如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
</dependencies
(3)在src/main/java下新建包com.onyx,再新建一个HelloWorld类,使用注解@Value获取配置文件application.properties(后面创建)中的值,格式为${user.name},其中user.name为配置的名字。代码如下:
package com.onyx;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration //标明是一个配置类
public class HelloWorld {
//通过@Value注解,把配置文件中的user.name注入当前类中
@Value("${user.name}")
private String name;
public void setName(String name) {
this.name = name;
}
public HelloWorld() {
System.out.println("初始化构造器");
}
public void hello() {
System.out.println("Hello: " + name);
}
}
(4)本书不使用传统的XML配置方式,而是尽量使用注解的形式配置项目,Spring Boot的官方团队也推荐在开发中使用注解的形式进行配置,Hello World项目也是如此。在resources目录下新建Spring Boot的默认配置文件application.properties,在其中新建配置如下:
#设置用户的名字为CC
user.name=CC
(5)在包com.onyx下新建一个测试类Demo,代码如下:
package com.onyx;
import org.springframework.context.annotation.AnnotationConfig
ApplicationContext;
public class Demo {
public static void main(String[] args) {
//使用配置文件初始化一个Spring的IoC容器
AnnotationConfigApplicationContext context = new
AnnotationConfig
ApplicationContext(HelloWorld.class);
//根据HelloWord的类找到Bean实例
HelloWorld bean = context.getBean(HelloWorld.class);
//调用Bean的方法,验证注入属性是否成功
bean.hello();
}
}
(6)运行Demo中的main()函数就可以看到控制台打印的结果,如图1.10所示。
图1.10 Hello World运行结果
图1.10展示了在Spring中如何获取Bean。默认情况下,Spring会把类名的首字母变成小写后作为当前注入的Bean的名字,因此当前Bean的名字应该是helloWorld。使用Bean的名字从Spring容器中获取Bean,调用hello()方法,结果如图1.11所示。读者可以更改代码中的main()函数进行测试。
图1.11 根据名字获取Bean
通过上面的Hello World项目,我们已经完成了Spring的入门体验,实现了从Spring Ioc容器中获取一个Bean、然后调用Bean的方法。此Bean和newHelloWorld()产生的对象不同,此Bean是Spring增强后产生的代理对象,是受Spring管理的对象。
Spring常用注解介绍
Spring开发团队为开发者定义了很多注解,这些注解代表Spring的配置,在项目开发过程中可以根据实际需求进行配置。如表1.2所示为Spring常用注解配置。
下面介绍Spring业务开发中常用的注解,它们用来注入业务类或标记业务方法,如表1.3所示。
简析Spring MVC的请求流程
Spring MVC是Spring框架的扩展,主要用于Web开发。Spring MVC通过Model- View-Controller模式将数据、业务与效果展示进行分离,其核心是围绕DispatcherServlet类展开的。DispatcherServlet类负责将请求分配给对应的Handler进行处理,然后将数据返回给指定的视图,完成整个请求过程。Spring MVC的请求流程如图1.12所示。
根据图1.12所示,Spring MVC的请求流程如下:
(1)用户向前端控制器(DispatcherServlet)发起请求,该控制器会过滤不能访问的用户请求。
(2)前端控制器通过处理器映射器将URL匹配到相应的Controller映射的组件上,即返回处理器(Handler)。
(3)返回处理器之前处理设置的拦截器。
(4)DispatcherServlet收到返回的处理器后,通过处理适配器(HandlerAdapter)来访问处理器,并处理用户请求。
(5)执行处理器将ModelAndView对象作为结果返回给HandlerAdapter。
(6)通过HandlerAdapter将ModelAndView对象返回给前端控制器。
(7)前端控制器请求视图解析器(ViewResolver)进行视图解析,根据逻辑视图名解析为真正的视图(JSP、Freemaker、HTML),即根据ModelAndView对象中存放的视图名称进行查找,找到对应的页面后形成视图对象。
(8)将视图对象返回给前端控制器。
(9)视图渲染,将ModelAndView对象中的数据放入Request域中,让页面渲染数据。
(10)将渲染数据后的视图返回给用户,完成整个请求。
目前,Spring官方不建议搭建Spring MVC进行演示,开发人员可以直接使用Spring Boot,第2章我们将会进行Spring MVC的功能演示。