使用SpringBoot
本节将详细介绍如何使用 Spring Boot。它涵盖了诸如构建系统,自动配置以及如何运行应用程序之类的主题。我们还将介绍一些 Spring Boot 最佳实践。尽管 Spring Boot 并没有什么特别的地方(它只是另一个可以使用的库),但是有一些建议可以使您的开发过程更轻松一些。
如果您是从 Spring Boot 开始的,那么在进入本节之前,您应该阅读 Getting Started指南
系统构建
强烈建议您选择一个支持dependency management并且可以使用发布到“ Maven Central”存储库的工件的构建系统。我们建议您选择 Maven 或 Gradle。可以使 Spring Boot 与其他构建系统(例如,Ant)一起使用,但是它们并没有得到很好的支持。
依赖性管理
Spring Boot的每个版本都提供了它所支持的依赖项的列表。实际上,您不需要为构建配置中的所有这些依赖项提供版本,因为 Spring Boot 会为您管理版本。当您升级 Spring Boot 本身时,这些依赖项也会以一致的方式升级。
Note
您仍然可以指定版本,并在需要时覆盖 Spring Boot 的建议。
精选列表包含可与 Spring Boot 一起使用的所有 spring 模块以及经过改进的第三方库列表。该列表作为标准物料 Lists(Spring 引导相关性)可用,可以与Maven和Gradle一起使用。
Warning
每个 Spring Boot 版本都与 Spring Framework 的基本版本相关联。我们强烈建议您不要指定其版本。
Maven
要了解如何使用Spring Boot与Maven,请参考Spring Boot的Maven插件文档:Maven
Gradle
Spring Boot Gradle插件在Gradle中提供了Spring Boot支持,允许您打包可执行的jar或war文件,运行Spring Boot应用程序,并使用spring-boot-dependencies
提供的依赖管理。它需要6级(6.3级或更高)。Gradle 5.6。x也被支持,但是这个支持不被支持,将在将来的版本中被删除。请参考插件的文档来了解更多:
Ant
可以使用 Apache Ant Ivy 构建 Spring Boot 项目。 spring-boot-antlib
“ AntLib”模块也可用于帮助 Ant 创建可执行 jar。
要声明依赖关系,典型的ivy.xml
文件看起来类似于以下示例:
1 | <ivy-module version="2.0"> |
典型的build.xml
类似于以下示例:
1 | <project |
Tip
如果您不想使用
spring-boot-antlib
模块,请参阅 第 91.9 节“不使用 spring-boot-antlib 从 Ant 构建可执行存档”“操作方法”。
Starters
Starter 程序是一组方便的依赖项描述符,您可以在应用程序中包括它们。您可以获得所需的所有Spring和相关技术的一站式服务,而无需遍历示例代码和复制粘贴依赖描述符的加载。例如,如果要开始使用 Spring 和 JPA 进行数据库访问,请在项目中包括spring-boot-starter-data-jpa
依赖项。
Starter 程序包含许多启动项目并快速运行所需的依赖项,并且具有一组受支持的受管传递性依赖项。
What’s in a name
所有“官方”Starter 者都遵循类似的命名方式; spring-boot-starter-*
,其中*
是特定类型的应用程序。这种命名结构旨在在您需要寻找 Starter 者时提供帮助。许多 IDE 中的 Maven 集成使您可以按名称搜索依赖项。例如,在安装了适当的 Eclipse 或 STS 插件的情况下,您可以在 POM 编辑器中按ctrl-space
并键入“ spring-boot-starter”以获取完整列表。
如“ 创建自己的 Starter”部分中所述,第三方启动程序不应以spring-boot
开头,因为它是为官方 Spring Boot 工件保留的。而是,第三方启动程序通常以项目名称开头。例如,一个名为thirdpartyproject
的第三方启动程序项目通常会被命名为thirdpartyproject-spring-boot-starter
。
Spring Boot 在org.springframework.boot
组下提供了以下应用程序启动器:
表 13.1. Spring Boot 应用程序启动器
Name | Description | Pom |
---|---|---|
spring-boot-starter |
核心 Starter 工具,包括自动配置支持,日志记录和 YAML | Pom |
spring-boot-starter-activemq |
使用 Apache ActiveMQ 的 JMS 消息传递 Starter | Pom |
spring-boot-starter-amqp |
使用 Spring AMQP 和 Rabbit MQ 的 Starter | Pom |
spring-boot-starter-aop |
使用 Spring AOP 和 AspectJ 进行面向方面编程的 Starter | Pom |
spring-boot-starter-artemis |
使用 Apache Artemis 的 JMS 消息传递 Starter | Pom |
spring-boot-starter-batch |
使用 Spring Batch 的 Starter | Pom |
spring-boot-starter-cache |
使用 Spring Framework 的缓存支持的 Starter 者 | Pom |
spring-boot-starter-cloud-connectors |
使用 Spring Cloud Connectors 的 Starter 程序,可简化与 Cloud Foundry 和 Heroku 等云平台中服务的连接 | Pom |
spring-boot-starter-data-cassandra |
使用 Cassandra 分布式数据库和 Spring Data Cassandra 的 Starter | Pom |
spring-boot-starter-data-cassandra-reactive |
使用 Cassandra 分布式数据库和 Spring Data Cassandra Reactive 的 Starter | Pom |
spring-boot-starter-data-couchbase |
使用 Couchbase 面向文档的数据库和 Spring Data Couchbase 的 Starter | Pom |
spring-boot-starter-data-couchbase-reactive |
使用 Couchbase 面向文档的数据库和 Spring Data Couchbase Reactive 的 Starter | Pom |
spring-boot-starter-data-elasticsearch |
使用 Elasticsearch 搜索和分析引擎以及 Spring Data Elasticsearch 的 Starter 者 | Pom |
spring-boot-starter-data-jdbc |
使用 Spring Data JDBC 的 Starter | Pom |
spring-boot-starter-data-jpa |
将 Spring Data JPA 与 Hibernate 结合使用的 Starter | Pom |
spring-boot-starter-data-ldap |
使用 Spring Data LDAP 的 Starter | Pom |
spring-boot-starter-data-mongodb |
使用 MongoDB 面向文档的数据库和 Spring Data MongoDB 的 Starter | Pom |
spring-boot-starter-data-mongodb-reactive |
使用 MongoDB 面向文档的数据库和 Spring Data MongoDB Reactive 的 Starter | Pom |
spring-boot-starter-data-neo4j |
使用 Neo4j 图形数据库和 Spring Data Neo4j 的 Starter | Pom |
spring-boot-starter-data-redis |
使用 Redis 键值数据存储与 Spring Data Redis 和 Lettuce Client 端的 Starter | Pom |
spring-boot-starter-data-redis-reactive |
将 Redis 键值数据存储与 Spring Data Redis Reacting 和 Lettuce Client 端一起使用的 Starter | Pom |
spring-boot-starter-data-rest |
使用 Spring Data REST 在 REST 上公开 Spring Data 存储库的 Starter | Pom |
spring-boot-starter-data-solr |
结合使用 Apache Solr 搜索平台和 Spring Data Solr 的 Starter 者 | Pom |
spring-boot-starter-freemarker |
使用 FreeMarker 视图构建 MVC Web 应用程序的 Starter | Pom |
spring-boot-starter-groovy-templates |
使用 Groovy 模板视图构建 MVC Web 应用程序的 Starter | Pom |
spring-boot-starter-hateoas |
使用 Spring MVC 和 Spring HATEOAS 构建基于超媒体的 RESTful Web 应用程序的 Starter 者 | Pom |
spring-boot-starter-integration |
使用 Spring Integration 的 Starter | Pom |
spring-boot-starter-jdbc |
结合使用 JDBC 和 HikariCP 连接池的 Starter | Pom |
spring-boot-starter-jersey |
使用 JAX-RS 和 Jersey 构建 RESTful Web 应用程序的 Starter。 spring-boot-starter-web的替代品 | Pom |
spring-boot-starter-jooq |
使用 jOOQ 访问 SQL 数据库的 Starter。替代spring-boot-starter-data-jpa或spring-boot-starter-jdbc | Pom |
spring-boot-starter-json |
读写 JSON Starter | Pom |
spring-boot-starter-jta-atomikos |
使用 Atomikos 的 JTATransactionStarter | Pom |
spring-boot-starter-jta-bitronix |
使用 Bitronix 的 JTATransactionStarter | Pom |
spring-boot-starter-mail |
开始使用 Java Mail 和 Spring Framework 的电子邮件发送支持 | Pom |
spring-boot-starter-mustache |
使用 Mustache 视图构建 Web 应用程序的 Starter | Pom |
spring-boot-starter-oauth2-client |
使用 Spring Security 的 OAuth2/OpenID Connect Client 端功能的 Starter | Pom |
spring-boot-starter-oauth2-resource-server |
使用 Spring Security 的 OAuth2 资源服务器功能的 Starter | Pom |
spring-boot-starter-quartz |
Starter 使用 Quartz Scheduler | Pom |
spring-boot-starter-security |
使用 Spring Security 的 Starter | Pom |
spring-boot-starter-test |
用于使用包括 JUnit,Hamcrest 和 Mockito 在内的库测试 Spring Boot 应用程序的 Starter 程序 | Pom |
spring-boot-starter-thymeleaf |
使用 Thymeleaf 视图构建 MVC Web 应用程序的 Starter | Pom |
spring-boot-starter-validation |
通过 Hibernate Validator 使用 Java Bean 验证的 Starter | Pom |
spring-boot-starter-web |
使用 Spring MVC 构建 Web(包括 RESTful)应用程序的 Starter 者。使用 Tomcat 作为默认的嵌入式容器 | Pom |
spring-boot-starter-web-services |
使用 Spring Web Services 的 Starter | Pom |
spring-boot-starter-webflux |
使用 Spring Framework 的反应式 Web 支持构建 WebFlux 应用程序的 Starter 者 | Pom |
spring-boot-starter-websocket |
使用 Spring Framework 的 WebSocket 支持构建 WebSocket 应用程序的 Starter | Pom |
除应用程序启动程序外,以下启动程序还可用于添加 production ready 功能:
表 13.2 Spring Boot 生产启动器
Name | Description | Pom |
---|---|---|
spring-boot-starter-actuator |
使用 Spring Boot 的 Actuator 的 Starter 程序,它提供了生产就绪功能,可帮助您监视和 Management 应用程序 | Pom |
最后,Spring Boot 还包括以下启动程序,如果您想排除或交换特定的技术方面,可以使用这些启动程序:
表 13.3 Spring Boot 技术 Starter
Name | Description | Pom |
---|---|---|
spring-boot-starter-jetty |
使用 Jetty 作为嵌入式 servlet 容器的 Starter 者。 spring-boot-starter-tomcat的替代品 | Pom |
spring-boot-starter-log4j2 |
使用 Log4j2 进行日志记录的启动器。 spring-boot-starter-logging的替代品 | Pom |
spring-boot-starter-logging |
使用 Logback 进行日志记录的启动器。默认记录启动器 | Pom |
spring-boot-starter-reactor-netty |
使用 Reactor Netty 作为嵌入式反应式 HTTP 服务器的 Starter 者。 | Pom |
spring-boot-starter-tomcat |
使用 Tomcat 作为嵌入式 servlet 容器的 Starter。 spring-boot-starter-web使用的默认 servlet 容器启动器 | Pom |
spring-boot-starter-undertow |
使用 Undertow 作为嵌入式 servlet 容器的 Starter。 spring-boot-starter-tomcat的替代品 | Pom |
Tip
有关其他社区贡献的 Starter 者的列表,请参阅 GitHub
spring-boot-starters
模块中的README file。
构建代码
Spring Boot 不需要任何特定的代码布局即可工作。但是,有一些最佳实践可以帮助您。
使用”default”软件包
当一个类不包含package
声明时,它将被视为在“默认包”中。通常不建议使用“默认程序包”,应避免使用。对于使用@ComponentScan
,@EntityScan
或@SpringBootApplication
注解的 Spring Boot 应用程序,这可能会导致特定的问题,因为每个 jar 中的每个类都会被读取。
Tip
我们建议您遵循 Java 建议的程序包命名约定,并使用反向域名(例如
com.example.project
)。
查找主应用程序类
我们通常建议您将主应用程序类放在其他类之上的根包中。 @SpringBootApplication annotation通常放在您的主类上,它隐式定义某些项目的基本“搜索包”。例如,如果您正在编写 JPA 应用程序,则使用@SpringBootApplication
注解的类的包来搜索@Entity
项。使用根软件包还允许组件扫描仅应用于您的项目。
Tip
如果您不想使用
@SpringBootApplication
,则导入的@EnableAutoConfiguration
和@ComponentScan
注解将定义该行为,因此也可以使用它。
以下 Lists 显示了典型的布局:
1 | com |
Application.java
文件将声明main
方法以及基本的@SpringBootApplication
,如下所示:
1 | package com.example.myapplication; |
配置类
Spring Boot 支持基于 Java 的配置。尽管可以将SpringApplication
与 XML 源一起使用,但是我们通常建议您的主要源为单个@Configuration
类。通常,定义main
方法的类是主要@Configuration
的不错的选择。
Tip
Internet 上已经发布了许多使用 XML 配置的 Spring 配置示例。如果可能,请始终尝试使用等效的基于 Java 的配置。搜索`Enable*注解可能是一个不错的起点。
导入其他配置类
您无需将所有@Configuration
都放在一个类中。 @Import
注解可用于导入其他配置类。另外,您可以使用@ComponentScan
自动拾取所有 Spring 组件,包括@Configuration
类。
导入 XML 配置
如果绝对必须使用基于 XML 的配置,我们建议您仍然从@Configuration
类开始。然后,您可以使用@ImportResource
注解来加载 XML 配置文件。
自动配置
Spring Boot 自动配置会尝试根据添加的 jar 依赖项自动配置 Spring 应用程序。例如,如果HSQLDB
在 Classpath 上,并且您尚未手动配置任何数据库连接 bean,那么 Spring Boot 会自动配置内存数据库。
您需要通过向@Configuration
类之一添加@EnableAutoConfiguration
或`@SpringBootApplication注解来选择自动配置。
Tip
您只能添加一个
@SpringBootApplication
或@EnableAutoConfiguration
注解。通常,我们建议您仅其中一个添加到主要的@Configuration
类中。
逐步取代自动配置
自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置,以替换自动配置的特定部分。例如,如果您添加自己的DataSource
bean,则默认的嵌入式数据库支持将退出。
如果您需要找出当前正在应用的自动配置以及原因,请使用--debug
开关启动您的应用程序。这样做可以启用调试日志以供选择核心 Logger,并将条件报告记录到控制台。
禁用特定的自动配置类
如果发现正在应用不需要的特定自动配置类,则可以使用@EnableAutoConfiguration
的 exclude 属性禁用它们,如以下示例所示:
1 | import org.springframework.boot.autoconfigure.*; |
如果该类不在 Classpath 中,则可以使用注解的excludeName
属性,并指定完全限定的名称。最后,您还可以使用spring.autoconfigure.exclude
属性来控制要排除的自动配置类的列表。
Tip
您可以在 Comments 级别和使用属性来定义排除项。
SpringBean和依赖注入
您可以自由使用任何标准的 Spring Framework 技术来定义 bean 及其注入的依赖项。为简单起见,我们经常发现使用@ComponentScan
(查找您的 bean)和使用@Autowired
(进行构造函数注入)效果很好。
如果按照上面的建议构造代码(将应用程序类放在根包中),则可以添加@ComponentScan
而没有任何参数。您的所有应用程序组件(@Component
,@Service
,@Repository
,@Controller
等)都会自动注册为 Spring Bean。
以下示例显示了一个@Service
Bean,它使用构造函数注入来获取所需的RiskAssessor
bean:
1 | package com.example.service; |
如果 bean 具有一个构造函数,则可以省略@Autowired
,如以下示例所示:
1 |
|
Tip
请注意,使用构造函数注入如何将
riskAssessor
字段标记为final
,指示该字段随后不能更改。
使用SpringBootApplication注解
许多 Spring Boot 开发人员喜欢他们的应用程序使用自动配置,组件扫描,并能够在其“应用程序类”上定义额外的配置。单个@SpringBootApplication
注解可用于启用这三个功能,即:
@EnableAutoConfiguration
:启用Spring Boot 的自动配置机制@ComponentScan
:对应用程序所在的软件包启用@Component
扫描(请参见最佳做法@Configuration
:允许在上下文中注册额外的 bean 或导入其他配置类
@SpringBootApplication
注解等效于将@Configuration
,@EnableAutoConfiguration
和@ComponentScan
及其默认属性一起使用,如以下示例所示:
1 | package com.example.myapplication; |
Note
@SpringBootApplication
还提供别名以自定义@EnableAutoConfiguration
和@ComponentScan
的属性。Note
这些功能都不是强制性的,您可以选择用它启用的任何功能替换此单个注解。例如,您可能不想在应用程序中使用组件扫描:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.example.myapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}在此示例中,
Application
就像其他任何 Spring Boot 应用程序一样,除了不会自动检测到@Component
注解的类并且显式导入用户定义的 Bean(请参阅@Import
)。
运行您的应用程序
将应用程序打包为 jar 并使用嵌入式 HTTP 服务器的最大优势之一是,您可以像运行其他应用程序一样运行应用程序。调试 Spring Boot 应用程序也很容易。您不需要任何特殊的 IDE 插件或扩展。
Note
本节仅介绍基于Jar的包装。如果选择将应用程序打包为 war 文件,则应参考服务器和 IDE 文档。
从IDE运行
您可以将 IDE 中的 Spring Boot 应用程序作为简单的 Java 应用程序运行。但是,您首先需要导入您的项目。导入步骤因您的 IDE 和构建系统而异。大多数 IDE 可以直接导入 Maven 项目。例如,Eclipse 用户可以从File
菜单中选择Import…
→Existing Maven Projects
。
如果您不能直接将项目导入到 IDE 中,则可以使用构建插件来生成 IDE 元数据。 Maven 包括Eclipse和IDEA的插件。 Gradle 提供了various IDEs的插件。
Tip
如果不小心两次运行 Web 应用程序,则会看到“端口已在使用中”错误。 STS 用户可以使用
Relaunch
按钮而不是Run
按钮来确保关闭任何现有实例。
作为打包的应用程序运行
如果使用 Spring Boot Maven 或 Gradle 插件创建可执行 jar,则可以使用java -jar
运行应用程序,如以下示例所示:
1 | $ java -jar target/myapplication-0.0.1-SNAPSHOT.jar |
也可以在启用了远程调试支持的情况下运行打包的应用程序。这样做使您可以将调试器附加到打包的应用程序,如以下示例所示:
1 | $ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ |
使用Maven插件
Spring Boot Maven 插件包含一个run
目标,可用于快速编译和运行您的应用程序。应用程序以爆炸形式运行,就像在 IDE 中一样。以下示例显示了运行 Spring Boot 应用程序的典型 Maven 命令:
1 | $ mvn spring-boot:run |
您可能还想使用MAVEN_OPTS
os 环境变量,如以下示例所示:
1 | $ export MAVEN_OPTS=-Xmx1024m |
使用Gradle插件
Spring Boot Gradle 插件还包括一个bootRun
任务,可用于以爆炸形式运行您的应用程序。每当您应用org.springframework.boot
和java
插件时,便会添加bootRun
任务,并在以下示例中显示:
1 | $ gradle bootRun |
您可能还想使用JAVA_OPTS
os 环境变量,如以下示例所示:
1 | $ export JAVA_OPTS=-Xmx1024m |
热插拔
由于 Spring Boot 应用程序只是普通的 Java 应用程序,因此 JVM 热交换应该可以立即使用。 JVM 热插拔在一定程度上受到它可以替换的字节码的限制。要获得更完整的解决方案,可以使用JRebel。
spring-boot-devtools
模块还包括对应用程序快速重启的支持。有关详细信息,请参见本章后面的第 20 章,开发人员工具部分和热插拔“操作方法”。
开发者工具
Spring Boot 包括一组额外的工具,这些工具可以使应用程序开发体验更加愉快。 spring-boot-devtools
模块可以包含在任何项目中,以提供其他开发时功能。要包括 devtools 支持,请将模块依赖项添加到您的构建中,如以下 Maven 和 Gradle Lists 所示:
Maven.
1 | <dependencies> |
Gradle.
1 | configurations { |
Note
运行完全打包的应用程序时,将自动禁用开发人员工具。如果您的应用程序是从
java -jar
启动的,或者是从特殊的类加载器启动的,则将其视为“生产应用程序”。在 Maven 中将依赖项标记为可选,或在 Gradle 中使用自定义的“ developmentOnly”配置(如上所示)是一种最佳实践,它可以防止将 devtools 过渡地应用到使用项目的其他模块。Tip
重新打包的存档默认情况下不包含 devtools。如果要使用某些远程 devtools 功能,则需要禁用
excludeDevtools
build 属性以包括它。 Maven 和 Gradle 插件均支持该属性。
属性默认值
Spring Boot 支持的一些库使用缓存来提高性能。例如,template engines缓存已编译的模板,以避免重复分析模板文件。而且,Spring MVC 可以在提供静态资源时向响应添加 HTTP 缓存 Headers。
虽然缓存在生产中非常有益,但在开发过程中可能适得其反,从而使您无法看到刚刚在应用程序中所做的更改。因此,默认情况下,spring-boot-devtools 禁用缓存选项。
缓存选项通常由application.properties
文件中的设置配置。例如,Thymeleaf 提供了spring.thymeleaf.cache
属性。无需手动设置这些属性,spring-boot-devtools
模块会自动应用合理的开发时配置。
由于在开发 Spring MVC 和 Spring WebFlux 应用程序时需要有关 Web 请求的更多信息,因此开发人员工具将为web
日志记录组启用DEBUG
日志记录。这将为您提供有关传入请求,正在处理的处理程序,响应结果等的信息。如果您希望记录所有请求详细信息(包括潜在的敏感信息),则可以打开spring.http.log-request-details
配置属性。
Note
如果您不希望应用属性默认值,则可以在
application.properties
中将spring.devtools.add-properties
设置为false
。Tip
有关 devtools 应用的属性的完整列表,请参见DevToolsPropertyDefaultsPostProcessor。
自动重启
每当 Classpath 上的文件更改时,使用spring-boot-devtools
的应用程序都会自动重新启动。当在 IDE 中工作时,这可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。默认情况下,将监视 Classpath 上指向文件夹的任何条目的更改。请注意,某些资源,例如静态资产和视图模板不需要重新启动应用程序。
Triggering a restart
当 DevTools 监视 Classpath 资源时,触发重启的唯一方法是更新 Classpath。导致 Classpath 更新的方式取决于您使用的 IDE。在 Eclipse 中,保存修改后的文件将导致 Classpath 被更新并触发重新启动。在 IntelliJ IDEA 中,构建项目(Build -> Build Project
)具有相同的效果。
Note
只要启用了分叉,您还可以使用受支持的构建插件(Maven 和 Gradle)来启动应用程序,因为 DevTools 需要隔离的应用程序类加载器才能正常运行。默认情况下,Gradle 和 Maven 在 Classpath 上检测到 DevTools 时会这样做。
Tip
与 LiveReload 一起使用时,自动重新启动效果很好。 请参阅“ LiveReload”部分了解详情。如果使用 JRebel,则禁用自动重新启动,而有利于动态类重新加载。仍可以使用其他 devtools 功能(例如 LiveReload 和属性替代)。
Note
DevTools 依靠应用程序上下文的关闭钩子在重新启动期间将其关闭。如果禁用了关机钩子(
SpringApplication.setRegisterShutdownHook(false)
),它将无法正常工作。Note
在确定 Classpath 上的条目是否应在更改后触发重新启动时,DevTools 会自动忽略名为
spring-boot
,spring-boot-devtools
,spring-boot-autoconfigure
,spring-boot-actuator
和spring-boot-starter
的项目。Note
DevTools 需要自定义
ApplicationContext
使用的ResourceLoader
。如果您的应用程序已经提供了,它将被包装。不支持在ApplicationContext
上直接覆盖getResource
方法。
Restart vs Reload
Spring Boot 提供的重启技术通过使用两个类加载器来工作。不变的类(例如,来自第三方 jar 的类)将被加载到 base 类加载器中。您正在积极开发的类将加载到 restart 类加载器中。重新启动应用程序后,将丢弃 restart 类加载器,并创建一个新的类加载器。这种方法意味着应用程序的重启通常比“冷启动”要快得多,因为 base 类加载器已经可用并已填充。
如果您发现重新启动对于应用程序而言不够快,或者遇到类加载问题,则可以考虑从 ZeroTurnaround 重新加载诸如JRebel之类的技术。这些方法通过在加载类时重写类来使其更易于重新加载。
记录条件评估中的更改
默认情况下,每次应用程序重新启动时,都会记录一个报告,其中显示了条件评估增量。该报告显示了在进行更改(例如添加或删除 bean 以及设置配置属性)时对应用程序自动配置的更改。
要禁用报告的日志记录,请设置以下属性:
1 | false = |
排除资源
某些资源在更改时不一定需要触发重新启动。例如,Thymeleaf 模板可以就地编辑。默认情况下,更改/META-INF/maven
,/META-INF/resources
,/resources
,/static
,/public
或/templates
中的资源不会触发重新启动,但会触发live reload。如果要自定义这些排除项,则可以使用spring.devtools.restart.exclude
属性。例如,要仅排除/static
和/public
,则可以设置以下属性:
1 | static/**,public/** = |
Tip
如果要保留这些默认值并“添加”其他排除项,请改用
spring.devtools.restart.additional-exclude
属性。
注意其他路径
当您对不在 Classpath 上的文件进行更改时,您可能希望重新启动或重新加载应用程序。为此,使用spring.devtools.restart.additional-paths
属性配置其他路径以监视更改。您可以使用spring.devtools.restart.exclude
属性described earlier来控制其他路径下的更改是触发完全重启还是live reload。
禁用重启
如果您不想使用重新启动功能,则可以使用spring.devtools.restart.enabled
属性将其禁用。在大多数情况下,您可以在application.properties
中设置此属性(这样做仍会初始化重新启动类加载器,但它不会监视文件更改)。
如果您需要完全禁用重启支持(例如,因为它不适用于特定的库),则需要在调用SpringApplication.run(…)
之前将spring.devtools.restart.enabled
System
属性设置为false
,如以下示例所示:
1 | public static void main(String[] args) { |
使用触发文件
如果使用持续编译更改文件的 IDE,则可能更喜欢仅在特定时间触发重新启动。为此,可以使用“触发文件”,这是一个特殊文件,当您要实际触发重新启动检查时必须对其进行修改。更改文件只会触发检查,并且仅在 Devtools 检测到必须执行某些操作时才会重新启动。可以手动或使用 IDE 插件来更新触发文件。
要使用触发文件,请将spring.devtools.restart.trigger-file
属性设置为触发文件的路径。
Tip
您可能希望将
spring.devtools.restart.trigger-file
设置为global setting,以便所有项目的行为都相同。
自定义重启类加载器
如前面的重新启动与重新加载部分所述,重新启动功能是通过使用两个类加载器实现的。对于大多数应用程序,此方法效果很好。但是,有时可能会导致类加载问题。
默认情况下,IDE 中的任何打开的项目都将使用“重新启动”类加载器加载,而任何常规的.jar
文件都将使用“基本”类加载器加载。如果您在多模块项目上工作,并且并非每个模块都导入到 IDE 中,则可能需要自定义内容。为此,您可以创建一个META-INF/spring-devtools.properties
文件。
spring-devtools.properties
文件可以包含以restart.exclude
和restart.include
为前缀的属性。 include
元素是应上拉到“重新启动”类加载器中的项目,而exclude
元素是应下推到“基本”类加载器中的项目。该属性的值是一个应用于 Classpath 的正则表达式模式,如以下示例所示:
1 | /mycorp-common-[\\w-]+\.jar = |
Note
所有属性键都必须是唯一的。只要属性以
restart.include.
或restart.exclude.
开头,它就会被考虑。Tip
Classpath 中的所有
META-INF/spring-devtools.properties
都已加载。您可以将文件打包在项目内部或项目使用的库中。
已知限制
重新启动功能不适用于使用标准ObjectInputStream
反序列化的对象。如果需要反序列化数据,则可能需要结合使用Spring的ConfigurableObjectInputStream
和Thread.currentThread().getContextClassLoader()
。
不幸的是,一些第三方库在不考虑上下文类加载器的情况下反序列化。如果发现这样的问题,则需要向原始作者请求修复。
LiveReload
spring-boot-devtools
模块包括一个嵌入式 LiveReload 服务器,该服务器可用于在更改资源时触发浏览器刷新。可从livereload.com免费为 Chrome,Firefox 和 Safari 使用 LiveReload 浏览器扩展。
如果您不想在应用程序运行时启动 LiveReload 服务器,则可以将spring.devtools.livereload.enabled
属性设置为false
。
Note
一次只能运行一台 LiveReload 服务器。在启动应用程序之前,请确保没有其他 LiveReload 服务器正在运行。如果从 IDE 启动多个应用程序,则只有第一个具有 LiveReload 支持。
全局设置
您可以通过将名为.spring-boot-devtools.properties
的文件添加到$HOME
文件夹中来配置全局 devtools 设置(请注意,文件名以“.”开头)。添加到该文件的所有属性都适用于您机器上所有使用 devtools 的 Spring Boot 应用程序。例如,要将重新启动配置为始终使用trigger file,则应添加以下属性:
~/.spring-boot-devtools.properties.
1 | .reloadtrigger = |
Note
在
.spring-boot-devtools.properties
中激活的配置文件不会影响特定于配置文件的配置文件的加载。
远程应用程序
Spring Boot 开发人员工具不仅限于本地开发。远程运行应用程序时,您还可以使用多种功能。选择加入远程支持。要启用它,您需要确保重新打包的 Files 中包含devtools
,如以下 Lists 所示:
1 | <build> |
然后需要设置spring.devtools.remote.secret属性。与任何重要的密码或机密文件一样,该值应该是惟一的、强的,以便不能被猜测或强制使用。
1 | mysecret = |
远程 devtools 支持分为两部分:接受连接的服务器端端点和在 IDE 中运行的 Client 端应用程序。设置spring.devtools.remote.secret
属性后,将自动启用服务器组件。Client 端组件必须手动启动。
运行远程Client端应用程序
远程 Client 端应用程序旨在在您的 IDE 中运行。您需要使用与您连接到的远程项目相同的 Classpath 来运行org.springframework.boot.devtools.RemoteSpringApplication
。应用程序的单个必需参数是它连接到的远程 URL。
例如,如果您使用的是 Eclipse 或 STS,并且您有一个名为my-app
的项目已部署到 Cloud Foundry,则可以执行以下操作:
- 从
Run
菜单中选择Run Configurations…
。 - 创建一个新的
Java Application
“启动配置”。 - 浏览
my-app
项目。 - 使用
org.springframework.boot.devtools.RemoteSpringApplication
作为主要类。 - 将
https://myapp.cfapps.io
添加到Program arguments
(或任何远程 URL)。
正在运行的远程 Client 端可能类似于以下 Lists:
1 | . ____ _ __ _ _ |
Note
因为远程 Client 端使用与真实应用程序相同的 Classpath,所以它可以直接读取应用程序属性。这就是读取
spring.devtools.remote.secret
属性并将其传递给服务器进行身份验证的方式。Tip
始终建议使用
https://
作为连接协议,以便对通信进行加密并且不能截获密码。Tip
如果需要使用代理来访问远程应用程序,请配置
spring.devtools.remote.proxy.host
和spring.devtools.remote.proxy.port
属性。
远程更新
远程 Client 端以与local restart相同的方式监视应用程序 Classpath 中的更改。任何更新的资源都被推送到远程应用程序,并且(如果需要)触发重新启动。如果您迭代使用本地没有的云服务的功能,这将很有帮助。通常,远程更新和重新启动比完整的重建和部署周期要快得多。
Note
仅在远程 Client 端正在运行时监视文件。如果在启动远程 Client 端之前更改文件,则不会将其推送到远程服务器。
为生产环境打包Application
可执行 jar 可以用于生产部署。由于它们是独立的,因此它们也非常适合基于云的部署。
对于其他“生产准备就绪”功能,例如运行状况,审核和度量 REST 或 JMX 端点,请考虑添加spring-boot-actuator
。有关详细信息,请参见 第五部分,“ Spring Boot Actuator:可用于生产的功能”。
接下来要读什么
现在,您应该了解如何使用 Spring Boot 以及应遵循的一些最佳实践。现在,您可以 continue 深入了解特定的 Spring Boot 功能,或者可以跳过并阅读有关 Spring Boot 的“ production ready”方面的信息。