



在以前的项目开发中要使用Spring框架,需要开发者从官网下载所需版本的Spring jar包到本地项目中,然后再构建依赖,并且后续每新建一个项目都需要复制一份依赖到新项目中,然后再开始进行项目开发。自从Maven出现后,这种情况发生了改变,开发者只需要添加Spring依赖坐标就能自动下载所需要的jar包到项目中,改变了以前手动复制jar的过程,提高了开发效率。
Maven是一个跨平台地进行项目管理和构建综合工具,能让开发者更方便地管理和构建项目。Maven的最大特色是管理项目依赖,添加依赖后,它能够自动从中央仓库下载项目需要的jar包,从而构建项目依赖的jar包。Maven可以自动完成项目基础构建的管理,它使用的是标准的目录结构和默认的构建生命周期。当有多个开发者协作开发时,Maven可以设置按照约定快速完成项目的配置工作。
使用Maven进行项目开发有4个优点:
使用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。
项目开发中会涉及版本的迭代,如果一个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版本是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。
表1.1 常见的Maven命令
因为从国外的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的安装是下一步操作的基础,请读者务必安装。
当使用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 | Maven Project命令,弹出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项目目录
在Java的企业级开发中,常用的IDE还有IDEA。本书使用的IntelliJ IDEA的版本为IntelliJ IDEA 2018.3.6,请读者自行下载安装。安装完成后必须先进行配置。打开IntelliJ IDEA,选择File | Settings命令,弹出配置页面,在其中配置本地Maven,设置Maven的所在目录和配置文件位置,如图1.8所示。
图1.8 IntelliJ IDEA Maven设置
注意: User settings file选项配置的是conf下的settings.xml。Local repository选项可选择本地仓库,也可以新建一个目录。
完成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,这样会帮助开发者节省大量的构建时间,而且可以避免一些奇怪的项目构建问题。
本书中的所有代码都使用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和new HelloWorld()产生的对象不同,此Bean是Spring增强后产生的代理对象,是受Spring管理的对象。