



首先,我们将使用Spring Boot快速构建一个最基础的应用框架。我们可以通过Spring Boot初始化工具( https://start.spring.io/ ),如图2-1所示,完成项目框架的搭建,也可以从本书源码中获取项目代码,或从这里( https://github.com/cd826/springcloud-demo )下载示例项目源码。此外,在本书中都会使用Maven来进行项目的依赖管理,如果读者还对Maven不熟悉,可以从这里( http://t.cn/zHwU8G4 )进行了解。假如读者想在项目中使用Gradle而不是Maven,那么可以在IDE环境中直接将Maven脚本转换为Gradle,或通过手工进行转换。
图2-1 Spring Boot初始化工具
一旦创建或下载了该示例项目的框架代码,就可以开始着手编写Maven脚本代码了。Maven脚本文件默认为pom.xml,存放在项目根目录下。下面列出了本示例项目所使用的Maven脚本代码:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 这里将项目的父项目设置为Spring Boot,所使用版本为1.5.2.RELEASE -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<!-- 这里设置本项目的groupId、artifactId和版本等信息 -->
<groupId>cd826dong.cloud</groupId>
<artifactId>cd826dong-clouds-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringCloud Demo Projects -- Spring Boot</name>
<properties>
<!-- 定义项目所使用的编码为UTF-8 -->
<project.build.sourceEncoding>UTF-8</project.build.source
Encoding>
<!-- 项目所用JDK 1.8,也可以使用低版本,但建议还是使用JDK 1.8以上版本-->
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<!-- 项目所使用第三方包的版本,建议以后都采用这种方式,统一在一个地方声明版本
号,这样对项目可以进行统一管理,方便以后升级 -->
<guava.version>20.0</guava.version>
<swagger.version>2.6.1</swagger.version>
</properties>
<dependencies>
<!-- 项目所用Spring Boot starters:web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Guava可以为我们提供缓存、集合等一些方便的工具类 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 该插件限定Maven打包时所使用的版本,避免出现版本不匹配问题 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 该插件可以让Maven将工程直接打包成一个可以直接运行的JAR -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
对于本Maven脚本需要说明以下几个关键点。
·Spring Boot版本:这里采用1.5.2.RELEASE;
·Spring Boot Starter:这里仅添加了Web,说明这是一个Web应用;
·Guava:这是一个非常有用的工具库;
·spring-boot-maven-plugin插件:该插件可以将项目打包成一个Fat Jar,然后直接通过java-jar的方式运行。至于什么是Fat Jar,后面会详细说明。
说明:
在后续章节中,Maven脚本文件不会像这里一样全部列出,仅会列出关键或需要修改的部分。
对于Spring Boot应用来说,首先需要创建一个应用引导类。引导类的作用是让Spring Boot框架启动并初始化应用。引导类需要一个main(String[]args)主函数,并需要使用@SpringBootApplication注解标识。代码如下:
package com.cd826dong.clouddemo;
// 为了保持代码列表的清晰,这里及后续都会省略import相关的代码
import …;
// @SpringBootApplication注解可以让Spring Boot框架通过该类启动整个应用
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
// 调用SpringApplication启动一个Spring Boot应用
SpringApplication.run(Application.class, args);
}
}
在基于Spring Boot框架的应用中,@SpringBootApplication注解告诉Spring容器:使用该类作为所有Bean源,通过该起始点构建应用的上下文。@SpringBootApplication注解继承自@EnableAutoConfiguration和@ComponentScan,通过该注解使得项目在启动时Spring就会对该类所属目录下的所有子包进行扫描并根据Spring Boot的自动配置机制进行配置。
引导类如不在应用的根包中可能会造成部分配置或Bean无法被Spring扫描到,从而造成系统配置出错,导致启动失败。因此,建议读者在开始进行项目时始终将该引导类放在根包中,在我们的示例项目中根包就是com.cd826dong.clouddemo。如果项目中由于某些原因不能这么做的话,可以通过@ComponentScan注解进行修正,在@ComponentScan注解中可以配置需要扫描包的位置,代码如下:
package com.cd826dong.clouddemo.XXX.XX.application;
import …
@SpringBootApplication
// 这里我们通过@ComponentScan注解,将配置自动扫描的起始位置设置为com.cd826dong
@ComponentScan("com.cd826dong.**")
@EntityScan(basePackageClasses=User.class)
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
假如在项目中所要扫描的包有多个,那么可以在注解中通过逗号(,)将这多个包路径分开,如@ComponentScan("com.cd826dong.**,com.cd825dong.**")。
上面示例代码中,Application类的main()方法调用了SpringApplication.run(),该方法会在项目启动时构建一个Spring容器,并返回一个ApplicationContext对象,也就是项目应用的上下文。对于ApplicationContext重要性,使用过Spring开发的读者都应该明白,但在这里因为不需要该对象做后续任何处理,所以没有列出来。
因此,在后续使用Spring Boot进行微服务应用开发时,一定要记得在引导类中添加@SpringBootApplication注解。对于引导类的类名,可以不是Application,读者可以根据项目实际需要进行改动。
还有一点需要说明的是,对于引导类来说其是整个应用启动的初始点,因此,如果在应用启动时需要进行某些初始化处理,那么最好都在该类中完成。
对于一个Spring Boot应用,通常会有一个或多个配置文件,在配置文件中会存放应用所需的各项配置,如数据源、日志、启动端口等。Spring Boot配置文件支持properties和yml两种格式,默认文件名称都是application,存放在resources目录中。在本书的示例中会采用properties格式,如果读者喜欢使用yml格式,那么可以自行根据转换规则进行转换。本示例项目的配置文件(application.properties)内容如下:
# 应用启动后所监听的端口,可以不配置,默认就是8080端口 server.port=8080 # 配置日志输出级别,将Spring框架设置为INFO级别,而我们所编写的代码设置为DEBUG级别 logging.level.org.springframework=INFO logging.level.com.cd826dong=DEBUG
接下来就可以运行该项目了。启动运行方式有多种,比如可以选择直接在IDE中运行,如在笔者开发所用的IDEA中可以通过如图2-2所示的配置直接运行。
图2-2 在IDEA中直接启动项目
上面的方式开发调试非常方便。但是,对后续将要编写的微服务来说,更多的时候是打包成一个部署单元。在打包时就会使用之前我们在Maven脚本中所配置的spring-boot-maven-plugin插件,然后通过mvn clean package命令将项目打包成一个Fat Jar,在生产环境下可以直接使用下面的命令启动运行:
# 通过-jar直接启动 $ java -jar cd826dong-clouds-boot-0.0.1-SNAPSHOT.jar
应用成功启动后,在控制台中会看到如图2-3所示的输出。
图2-3 通过控制台启动项目
那么什么是Fat Jar呢?从字面意义上可以理解为胖Jar,也就是通过Maven打包所生成的这种Jar不仅仅包含本项目中源码所编译生成的Java类文件,还会包含项目所依赖的第三方库及有关项目启动的相关信息。比如,如果我们通过解压缩工具查看上面示例项目打包所生成的cd826dong-clouds-boot-0.0.1-SNAPSHOT.jar文件,可以看到在文件中会包含以下3个内容。
·项目代码:项目中所有源码经编译后会统一存放在BOOT-INF/classes目录下。
·项目依赖包:存放在BOOT-INF/lib目录下。
·应用启动相关文件:在org/springframework/boot/loader目录下则包含了Spring Boot启动时所需要的类。
还有一点需要说明的是,在本示例项目中我们只构建了一个简单的Java类,并通过该类中的main()函数启动运行,并没有在打包之后将文件部署到任何Web容器中进行运行。那么示例项目为何就可以作为一个Web应用启动了呢?Spring Boot又到底施展了什么“魔法”呢?如果仔细查看项目所依赖的包就会发现spring-boot-starter-web默认依赖了spring-boot-starter-tomcat,通过该依赖,Spring Boot在启动应用时就会启动一个内嵌的Tomcat容器,并在该容器中运行项目。如果不想使用Tomcat作为启动容器,而是使用Jetty,那么可以在pom.xml文件中排除对Tomcat的依赖,并增加spring-boot-starter-jetty即可。