翻译《Spring Boot Reference Guide》-第三单元.使用SpringBoot
发布日期:2021-06-28 15:39:51 浏览次数:3 分类:技术文章

本文共 24707 字,大约阅读时间需要 82 分钟。

第三单元.使用SpringBoot

本节将更详细地介绍如何使用SpringBoot。它覆盖的主题有构建系统,自动配置以及如何运行你的应用。我们也会提供一些SpringBoot的最佳实践。尽管关于SpringBoot没有什么特别之处(它只是另一个你可以使用的库),但是有一些建议,当你遵循了,可以让你的开发更简单一些。

如果你刚开始接触SpringBoot,你应该先阅读入门指南,然后进入这个章节。

13. 构建系统

强烈建议你选择一个构建系统,支持并且可以使用发布到“MavenCentral”仓库的工程包。我们建议你选择Maven或者Gradle。SpringBoot也可以支持其它构建系统(例如:Ant),不过它们并没有得到特别好的支持。

13.1 依赖管理

任何一个SpringBoot正式版本都会提供一份它支持的依赖关系的精选列表。实际上,你不需要提供版本号给任何在你构建配置文档中的依赖,SpringBoot会进行管理。当你升级SpringBoot时,这些依赖项也会以一致的方式升级。

如果你需要,你可以指定版本来覆盖SpringBoot建议的版本。

精选列表包含可与SpringBoot一起使用的所有spring模块以及完善的第三方库列表。该列表作为可与Maven和Gradle一起使用的标准材料清单。

每一个正式版本SpringBoot都关联基础版本的SpringFramework。我们强烈建议你不要指定其版本。

13.2 Maven

Maven用户可以继承spring-boot-starter-parent项目以获得合理的默认配置。该父项目提供以下的特征:

  • Java1.8作为默认编译器版本
  • 源码编码格式为UTF-8
  • 一个依赖管理部分,继承自spring-boot-dependenciespom,管理公共依赖的版本。当你自己的pom中使用,这个依赖管理让你忽略这些依赖项的标签
  • 使用repackage执行ID来实现一个可执行的repackage目标。
  • 智能的资源过滤
  • 智能的插件配置(exec插件,Git Commit ID和share)
  • 针对application.properties和application.yml 包括特定于配置文件的文件(例如application-dev.properties和 application-dev.yml)进行明智的资源过滤

请注意,自从application.properties和application.yml文件使用Spring风格的占位符(${}),Maven过滤改用(@…@)当占位符。(你可以设置属性来覆盖Maven的resource.delimiter属性)

13.2.1 继承自Starter Parent

要将你的项目配置为继承自spring-boot-starter-parent,设置parent如下:

org.springframework.boot
spring-boot-starter-parent
2.1.5.RELEASE

你只需要在这个依赖指定SpringBoot版本。如果你导入其它的启动器,你可以安全的忽略版本。

使用该设置,你还可以通过覆盖自己项目中的属性来覆盖各个依赖项。例如,要升级到另一个SpringDataReleasetrain,你可以将以下内容添加到你的pom.xml:

Fowler-SR2

检查 获取支持的属性列表。

13.2.2 在没有Parent Pom下使用SpringBoot

并不是所有人都喜欢继承spring-boot-starter-parent-POM。你可能需要使用你们公司的标准parent或者你可能希望显式声明所有Maven配置

如果你不希望使用spring-boot-starter-parent,你仍然可以通过dependencyManagement(不是插件管理)获取好处,使用scopre=import依赖,如下:

org.springframework.boot
spring-boot-dependencies
2.1.5.RELEASE
pom
import

如上所述,在前面的示例步骤没有让你使用属性来覆盖个别的依赖。为了取得相同的结果,你需要添加dependencyManagement在你的项目中,在spring-boot-dependencies依赖之前添加你的依赖。例如,要升级pringDataReleasetrain,你可以添加以下元素到你的pom.xml:

org.springframework.data
spring-data-releasetrain
Fowler-SR2
pom
import
org.springframework.boot
spring-boot-dependencies
2.1.5.RELEASE
pom
import

在前面的案例中,我们指定了BOM,但是可以以相同的方式覆盖任何依赖项类型。

13.2.3 使用SpringBoot Maven插件

SpringBoot包含一个可以打包项目作为可执行jar包的Maven插件。如果你要使用它,可以添加插件到你的部分,如下面显示的案例:

org.springframework.boot
spring-boot-maven-plugin

如果你使用了spring-boot-starter-parent-pom,则只需要添加插件。你不需要做任何配置,除非你要修改parent定义的设置。

13.3 Gradle

要了解有关将Spring Boot与Gradle结合使用的信息,请参阅Spring Boot的Gradle插件的文档::

  • Reference ( and )

13.4 Ant

可以使用Apache Ant + Ivy构建SpringBoot项目。该spring-boot-antlib的antlib模块还可以帮助Ant创建可执行的JAR文件。

为了声明依赖关系,典型ivy.xml文件看起来类似于以下示例:

一个经典的build.xml看起来类似以下案例:

如果您不想使用该spring-boot-antlib模块,请参见

13.5 启动器

启动器是一组方便的依赖关系描述符,你可以将其包含在应用程序中。你可以一站式获取所有spring以及关联的技术,不需要去搜索示例代码和复制粘贴依赖描述符。例如,如果你想要开始使用Spring和JPA来访问数据库,包含spring-boot-starter-data-jpa依赖项到你的项目。

启动器包含一系列项目启动,快速运行,一致性的依赖项,支持管理传递性依赖的集合。


名字叫什么

所有官方启动器遵循相似命名规则;spring-boot-starter-*,其中 *是特定类型的应用程序。这种命名结构在你需要寻找启动器时提供帮助。Maven集成在许多IDE中,使你可以按名称搜索依赖项。例如,在安装了适当的Eclipse或STS插件的情况下,你可以在POM编辑器按ctrl-space,然后键入“spring-boot-starter”以获取完整列表。

如部分中所述,第三方启动器不应以spring-boot开头,它被保留用于官方的springboot工程包。相反,第三方启动器通常以项目的名称开始。例如,一个第三方启动器项目称为thirdpartyproject,通常命名为thirdpartyproject-spring-boot-starter。


SpringBoot在该org.springframework.boot组下提供了以下应用程序启动器 :

Name Description Pom
spring-boot-starter 核心启动器,包括支持自动配置,日志记录和YAML
spring-boot-starter-activemq 使用Apache ActiveMQ的JMS消息通知启动器
spring-boot-starter-amqp 使用Spring AMQP和Rabbit MQ的启动器
spring-boot-starter-aop 使用Spring AOP和AspectJ进行面向切面编程的启动器
spring-boot-starter-artemis 使用Apache Artemis的JMS消息通知启动器
spring-boot-starter-batch 使用Spring Batch的启动器
spring-boot-starter-cache 使用Spring Framework缓存支持的启动器
spring-boot-starter-cloud-connectors 使用Spring Cloud Connectors的启动器,可简化与Cloud Foundry和Heroku等云平台中服务的连接
spring-boot-starter-data-cassandra 使用Cassandra分布式数据库和Spring Data Cassandra的启动器
spring-boot-starter-data-cassandra-reactive 使用Cassandra分布式数据库和Spring Data Cassandra Reactive的启动器
spring-boot-starter-data-couchbase 使用Couchbase面向文档的数据库和Spring Data Couchbase的启动器
spring-boot-starter-data-couchbase-reactive 使用Couchbase面向文档的数据库和Spring Data Couchbase Reactive的启动器
spring-boot-starter-data-elasticsearch 使用Elasticsearch搜索和分析引擎以及Spring Data Elasticsearch的启动器
spring-boot-starter-data-jdbc 使用Spring Data JDBC的启动器
spring-boot-starter-data-jpa 将Spring Data JPA与Hibernate结合使用的启动器
spring-boot-starter-data-ldap 使用Spring Data LDAP的启动器
spring-boot-starter-data-mongodb 使用MongoDB面向文档的数据库和Spring Data MongoDB的启动器
spring-boot-starter-data-mongodb-reactive 使用MongoDB面向文档的数据库和Spring Data MongoDB Reactive的启动器
spring-boot-starter-data-neo4j 使用Neo4j图形数据库和Spring Data Neo4j的启动器
spring-boot-starter-data-redis 使用Redis键值数据存储与Spring Data Redis和Lettuce客户端的启动器
spring-boot-starter-data-redis-reactive 将Redis键值数据存储与Spring Data Redis Reacting和Lettuce客户端一起使用的启动器
spring-boot-starter-data-rest 使用Spring Data REST通过REST公开Spring数据存储库的启动器
spring-boot-starter-data-solr 将Apache Solr搜索平台与Spring Data Solr结合使用的启动器
spring-boot-starter-freemarker 使用FreeMarker视图构建MVC Web应用程序的
spring-boot-starter-groovy-templates 使用Groovy模板视图构建MVC Web应用程序的启动器
spring-boot-starter-hateoas 使用Spring MVC和Spring HATEOAS构建基于超媒体的RESTful Web应用程序的启动器
spring-boot-starter-integration 使用Spring Integration的启动器
spring-boot-starter-jdbc 结合使用JDBC和HikariCP连接池的启动器
spring-boot-starter-jersey 使用JAX-RS和Jersey构建RESTful Web应用程序,代替spring-boot-starter-web的启动器
spring-boot-starter-jooq 使用jOOQ访问SQL数据库的启动器。替代spring-boot-starter-data-jpa或spring-boot-starter-jdbc
spring-boot-starter-json 读写JSON的启动器
spring-boot-starter-jta-atomikos 使用Atomikos的JTA交易的启动器
spring-boot-starter-jta-bitronix 使用Bitronix的JTA交易的启动器
spring-boot-starter-mail 使用Java Mail和Spring Framework的电子邮件发送支持的启动器
spring-boot-starter-mustache 使用Mustache视图构建Web应用程序的启动器
spring-boot-starter-oauth2-client 使用Spring Security的OAuth2或OpenID Connect客户端功能的启动器
spring-boot-starter-oauth2-resource-server 使用Spring Security的OAuth2资源服务器功能的启动器
spring-boot-starter-quartz 使用Quartz Scheduler的启动器
spring-boot-starter-security 使用Spring Security的启动器
spring-boot-starter-test 用于使用包括JUnit,Hamcrest和Mockito在内的库测试Spring Boot应用程序的启动器
spring-boot-starter-thymeleaf 使用Thymeleaf视图构建MVC Web应用程序的启动器
spring-boot-starter-validation 通过Hibernate Validator使用Java Bean验证的启动器
spring-boot-starter-web 使用SpringMVC构建Web(包括RESTful)应用程序的启动器。使用Tomcat作为默认的嵌入式容器
spring-boot-starter-web-services 使用Spring Web Services的启动器
spring-boot-starter-webflux 使用Spring Framework的Reactive Web支持构建WebFlux应用程序的启动器
spring-boot-starter-websocket 使用Spring Framework的WebSocket支持构建WebSocket应用程序的启动器

除了应用程序启动器,以下启动器可用于添加生产就绪功能:

Name Description Pom
spring-boot-starter-actuator 使用Spring Boot的Actuator的启动器,它提供了生产就绪功能,可帮助您监视和管理应用程序

Finally, Spring Boot also includes the following starters that can be used if you want to exclude or swap specific technical facets:

最后,Spring Boot还包括以下启动器,如果你想排除或交换特定的技术方面,可以使用这些启动器:

Name Description Pom
spring-boot-starter-jetty 使用Jetty作为嵌入式servlet容器的启动器。替代spring-boot-starter-tomcat
spring-boot-starter-log4j2 使用Log4j2进行日志记录的启动器。替代spring-boot-starter-logging
spring-boot-starter-logging 使用Logback进行日志记录的启动器。默认记录启动器
spring-boot-starter-reactor-netty 使用Reactor Netty作为嵌入式反应式HTTP服务器的启动器
spring-boot-starter-tomcat 用于将Tomcat用作嵌入式Servlet容器的启动器。使用spring-boot-starter-web默认使用的servlet容器启动器
spring-boot-starter-undertow 使用Undertow作为嵌入式servlet容器的启动器。替代spring-boot-starter-tomcat

有关社区贡献的其它启动器列表,可以查看GitHub中spring-boot-starters模块的README文件

14. 结构化你的代码

springboot不要求任何特定的代码布局就可以工作。但是有一些最佳实践可以提供帮助。

14.1 使用“default”包

当一个类文件不包含package的申明时,它被认为在“默认包”中。通常不建议使用“默认包”,应该避免使用。这可能导致特别的问题,当springboot应用使用@ComponentScan,@EntityScan,或者@SpringBootApplication注解,从每一个jar中读取每一个类。

我们建议你遵循Java建议的程序包命名约定,并使用反向域名(例如com.example.project)。

14.2 定位主应用类

我们通常建议你将主应用类放置在其它类之上的根包。注解经常被放置在你的主类,而且它意味着为指定项目定义一个基础“搜索包”。例如,如果你写一个JPA应用程序,该包的@SpringBootApplication注解类将会去搜索@Entity项目。使用根包还允许在你的项目上组件扫描。

如果你不想使用@SpringBootApplication,它导入了定义该行为的@EnableAutoConfiguration和@ComponentScan注解,因此你也可以使用它。

以下列表显示了典型的布局:

com +- example     +- myapplication         +- Application.java         |         +- customer         |   +- Customer.java         |   +- CustomerController.java         |   +- CustomerService.java         |   +- CustomerRepository.java         |         +- order             +- Order.java             +- OrderController.java             +- OrderService.java             +- OrderRepository.java

该Application.java文件将声明main方法以及basic方法, @SpringBootApplication如下所示:

package com.example.myapplication;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); }}

15. 配置类

springboot支持基于Java的配置。尽管它可以通过XML使用SpringApplication,我们通常建议你首先使用单一@Configuration类。通常,定义main方法的类都会@Configuration的最佳首选。

很多发布到互联网上的spring配置示例使用了XML配置,如果可以,希望可以尝试等同的基于Java配置。搜索Enable*注解可能是一个很好的起点。

15.1 入额外的配置类

你不需要放置你所有的@Configuration在一个类。@Import注解可以被用来导入额外的配置类。,你可以使用@ComponentScan去自动获得所有SpringComponents,包含@Configuration类。

15.2 导入XML配置

如果你一定需要使用基于XML配置,我们建议你依然使用@Configuration启动。你可以使用@ImportResource注解来加载XML配置文件。

16. 自动配置

springboot自动配置尝试去基于你添加的依赖jar包来自动配置你的spirng应用。例如,如果HSQLDB在你的classpath,而且你没有手动配置任何数据库连接,之后spirngboot会自动配置一个基于内存的数据库。

你需要选择通过添加@EnableAutoConfiguration或者@SpringBootApplication注解在你一个@Configuation类中来选择自动配置。

你应该永远只添加一个@SpringBootApplication或者@EnableAutoConfiguration注解。我们通常建议在你主要的@Configuration类上添加个@SpringBootApplication或者@EnableAutoConfiguration。

16.1 逐步替换自动配置

自动配置是非入侵的。在任何时刻,你可以开始定义你自己的配置来替换自动配置的特定部分。例如,如果你要添加你自己的DataSourceBean,默认的嵌入式数据库支持将退出。

如果你需要找出,自动配置在当前应用了哪些和为什么用,开启你应用的-debug开关。这样做可以开启调试日志,选择核心记录器,并将条件报告记录到控制台。

16.2 禁止特定的自动配置文件

如果你发现你正在应用不想使用的特定自动配置类,你可以使用@EnableAutoConfiguration的exclude属性来禁止它,如下示例所示:

import org.springframework.boot.autoconfigure.*;import org.springframework.boot.autoconfigure.jdbc.*;import org.springframework.context.annotation.*;@Configuration@EnableAutoConfiguration(exclude={
DataSourceAutoConfiguration.class})public class MyConfiguration {
}

如果这个类不在classpath,你可以使用@EnableAutoConfiguration的excludeName属性指定其完全限定名称来代替。最后,你还可以使用spring.autoconfigure.exclude属性来控制要排除的自动配置类的列表 。

  • @EnableAutoConfiguration的excludeName属性
import org.springframework.boot.autoconfigure.*;import org.springframework.boot.autoconfigure.jdbc.*;import org.springframework.context.annotation.*;@Configuration@SpringBootApplication(excludeName = {
"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})public class MyConfiguration {
}
  • spring.autoconfigure.exclude
# 多值使用,分隔spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

你可以在注释级别和使用属性来定义排除项。

17. Spring Beans和依赖注入

你可以自由使用任何标准的spring框架技术来定义你的beans和他们的注入依赖。为简单起见,我们经常发现使用@ComponentScam(去查找你的beans)和使用@Autowired(执行结构函数注入)效果很好。

如果你是按照上面的建议构造代码(放置你的应用类在根包中),你可以添加@ComponentScan不需要任何参数。所有你的应用组件(@Component,@Service,@Repository,@Controller)都会自动注册到spring beans。

以下案例展示一个@Service Bean使用构造函数注入来获得所需的RiskAssessor Bean:

package com.example.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor; @Autowired public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor; } // ...}

如果一个bean只有一个构造函数,你可以省略@Autowired,如以下示例展示:

@Servicepublic class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor; public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor; } // ...}

注意如何使用构造函数注入,使riskAssessor字段被标记为final,表明它之后无法被改变。

18. 使用@SpringBootApplication注解

许多springboot开发人员喜欢他们的应用使用自动配置,组件扫描和在“应用程序类”上允许定义额外的配置。单个SpringBootApplication注解可以启用这三个特征,即:

  • 启动spingboot的自动配置机制
  • 开启在应用程序所在的包上进行@Component扫描(参考最佳实践)
  • 允许在上下文注册额外的bean或导入额外的配置类

@SpringBootApplication注解等价于使用@Configuration,@EnableAutoConfiguration和@ComponentScan的默认属性,如以下示例展示:

package com.example.myapplication;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScanpublic class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); }}

@SpringBootApplication还提供了别命来自定义@EnableAutoConfiguration和@ComponentScan属性。

这些功能都不是强制性的,你可以选择用它启用的任何功能替换此单个注释。例如,你可能不想在应用程序中使用组件扫描:

package com.example.myapplication;import org.springframework.boot.SpringApplication;import org.springframework.context.annotation.ComponentScanimport org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;@Configuration@EnableAutoConfiguration@Import({
MyConfig.class, MyAnotherConfig.class })public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); }}

在这个示例中,Application和任何springboot应用一样,除了有注释@Component的类没有被自动检测到和显示导入用户定义的beans(查看@Import)

19. 运行你的应用

其中一个最大的优势是你可以打包你的应用程序作为一个jar,并且使用内嵌的HTTP服务,你可以像运行其它应用程序一样,运行你的应用程序。调试springboot应用程序一样很简单。你不需要特定的IDE插件或扩展。

这个章节只介绍打包jar。如果你选择打包你的应用程序作为一个war文件,你应该参考服务器和IDE文档。

19.1 从一个IDE运行

你可以像通过IDE运行简单java应用一样来运行springboot应用。无论如何,你首先需要导入你的项目。导入步骤取决于你的IDE和构建系统。大部分IDE可以直接导入Maven项目。例如,Eclipse用户可以从File菜单选择Import…->Existing Maven Projects

如果无法直接导入你的项目到你的IDE,你可能要允许使用构建插件来生成IDE元数据。Maven包含Eclipse和IDEA的插件。Gradle为多种IDE提供插件。

如果你不小心运行了两次web应用,你看到一个“端口已经被使用”的异常。STS(springtoolsuite)用户可以使用Relaunch按钮而不是Run按钮,来确认任何已存在的实例被关闭。

19.2 运行一个打包的应用程序

如果你使用Spring Boot Maven或Gradle插件去创建一个可执行jar,你可以使用java -jar来运行你的应用程序,如下所示:

$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar

它也可以支持远程调式模式下运行打包的应用程序。这样做让你的包应用附加调试器,如下面的示例所示:

$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/myapplication-0.0.1-SNAPSHOT.jar

19.3 使用Maven插件

springboot Maven插件包含run命令,可以用来快速编译和运行你的应用程序。应用程序以分解的形式运行,就像他们在你的IDE中所做的一样。下面案例展示经典的Maven命令去运行springboot应用程序:

$ mvn spring-boot:run

你可能也想使用MAVEN_OPTS操作系统环境变量,按以下示例展示:

$ export MAVEN_OPTS=-Xmx1024m

19.4 使用Gradle插件

springboot Gradle插件也包含bootRun任务,可以用它以分解的形式来运行你的应用程序。当你应用org.springframework.boot和java插件,都会添加bootRun任务,如下所示:

$ gradle bootRun

你可能也想使用JAVA_OPTS操作系统环境变量,按以下示例展示:

$ export JAVA_OPTS=-Xmx1024m

19.5 热交换

因为springboot应用程序只是简单的java应用程序,JVM热交换应该是开箱即用。JVM热交换在一定程度上受到它可以替换的字节码的限制。对于更完整的解决方案, 可以使用JRebel。

spring-boot-devtools模块包含支持快速重启应用程序。有关详细信息,请参见本章后面的Chapter20. Developer Tools章节和热交换操作细节。

20. 开发人员工具

springboot包含一些额外的工具,来让应用程序开发有一个更愉快的体验。spring-boot-devtools模块可以包含在任意项目中来提供额外的开发时功能。要包含devtools支持,添加该模块依赖到你的构件中,以下介绍Maven和Gradle:

  • Maven.
org.springframework.boot
spring-boot-devtools
true
  • Gradle.
configurations {	developmentOnly	runtimeClasspath {		extendsFrom developmentOnly	}}dependencies {	developmentOnly("org.springframework.boot:spring-boot-devtools")}

当你运行一个完全打包的应用程序,将自动禁用开发者工具。如果你的应用程序时通过java-jar或从其它特殊的类加载器启动,它将被认为是“生产应用”。如果对你不适用(如果你是通过容器来运行你的应用程序),考虑排除devtools或设置-Dspring.devtools.restart.enabled=false系统属性。

在Maven中将依赖项标记为可选,或在Gradle中使用自定义的“developmentOnly”配置(如上所示)是一种最佳做法,可防止将devtools过渡应用到使用项目的其他模块。

重新打包的存档默认情况下不包含devtools。如果要使用某个远程devtools功能,则需要禁用excludeDevtoolsbuild属性以包含它。Maven和Gradle插件均支持该属性。

20.1 属性默认值

springboot支持一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板,以避免重复解析模板文件。而且,SpringMVC可以在提供静态资源时向响应添加HTTP缓存标头。

尽管缓存在生产中非常有益,但在开发过程中可能适得其反,从而使你无法看到自己刚刚在应用程序中所做的更改。因此,默认情况下,spring-boot-devtools禁用缓存选项。

缓存选项通常通过配置application.properties文件来设定。例如,Thymeleaf提供spring.thymeleaf.cache属性。spring-boot-devtools模块无需自动设置这些属性,而是自动应用合理的开发时配置。

因为在开发SpringMVC和SpringWebFlux应用程序时需要有关Web请求的更多信息,所以开发者工具将启用DEBUG日志web记录组的日志记录。这将为你提供有关传入请求,正在处理的处理程序,响应结果等的信息。如果你希望记录所有请求的详细信息(包括潜在的敏感信息),则可以打开spring.http.log-request-details配置属性。

如果你不想属性使用默认值,可以在你的application.properties设置spring.devtools.add-properties=false

有关devtools应用的属性的完整列表,请参见。

static {		Map
properties = new HashMap<>(); properties.put("spring.thymeleaf.cache", "false"); properties.put("spring.freemarker.cache", "false"); properties.put("spring.groovy.template.cache", "false"); properties.put("spring.mustache.cache", "false"); properties.put("server.servlet.session.persistent", "true"); properties.put("spring.h2.console.enabled", "true"); properties.put("spring.resources.cache.period", "0"); properties.put("spring.resources.chain.cache", "false"); properties.put("spring.template.provider.cache", "false"); properties.put("spring.mvc.log-resolved-exception", "true"); properties.put("server.error.include-stacktrace", "ALWAYS"); properties.put("server.servlet.jsp.init-parameters.development", "true"); properties.put("spring.reactor.stacktrace-mode.enabled", "true"); PROPERTIES = Collections.unmodifiableMap(properties); }

20.2 自动重启

只要类路径上的文件发生更改,使用spring-boot-devtools的应用程序就会自动重新启动。当你通过IDE工作时,这个可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。默认情况下,将监视类路径上指向文件夹的任何条目的更改。请注意,某些资源(例如静态资产和视图模板)不需要重新启动应用程序。


触发重启

当DevTools监视类路径资源时,触发重启的唯一方法是更新类路径。导致类路径更新的方式取决于你使用的IDE。在Eclipse中,保存修改后的文件将导致类路径被更新并触发重新启动。在IntelliJ IDEA中,构建项目(Build -> Build Project)具有相同的效果。


只要启用了分叉,你还可以使用受支持的构建插件(Maven和Gradle)来启动应用程序,因为DevTools需要隔离的应用程序类加载器才能正常运行。默认情况下,Gradle和Maven在类路径上检测到DevTools时会这样做。

自动重启效果很好,当配合LiveReload使用时。。如果你使用JRebel,自动重启将失效,而支持动态类加载。其它devtools特性(例如LiveReload和属性覆盖)依然可以使用。

DevTools依赖于应用程序上下文的关闭挂钩在重新启动期间将其关闭。如果你禁用了关闭挂钩(SpringApplication.setRegisterShutdownHook(false)),它将无法正常工作。

当决定类路径中的条目发生变化时是否应该触发重新启动时,DevTools自动忽略命名的项目spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator,和spring-boot-starter。

DevTools需要使用的ApplicationContext去定制ResourceLoader。如果你的应用程序已经提供了,它将被包装。不支持直接覆盖ApplicationContext的getResource方法。


重启 vs 重载

springboot提供的重启技术通过使用两个类加载器来工作。不变的类(例如,来自第三方jar的类)将被加载到基类加载器中。你正在积极开发的类将加载到重新启动类加载器中。重新启动应用程序时,将丢弃重新启动类加载器,并创建一个新的类加载器。这种方法意味着应用程序的重启通常比“冷启动”要快得多,因为基本类加载器已经可用并已填充。

如果发现重新启动对于你的应用程序而言不够快,或者遇到类加载问题,则可以考虑重新加载技术,例如ZeroTurnaround的 JRebel。这些工作是通过在装入类时重写它们,使它们更易于重新装入。


20.2.1 记录条件评估中的更改

默认情况下,每次应用程序重新启动时,都会记录一个报告,其中显示了条件评估增量。该报告显示了在进行诸如添加或删除bean以及设置配置属性之类的更改时对应用程序自动配置的更改。

要禁用报告的日志记录,请设置以下属性:

spring.devtools.restart.log-condition-evaluation-delta=false

20.2.2 排除资源

某些资源在更改时不一定需要触发重新启动。例如,Thymeleaf模板可以就地编辑。默认情况下,改变资源/META-INF/maven,/META-INF/resources,/resources,/static,/public,或/templates不触发重新启动,但确会触发现场重装。如果要自定义这些排除项,则可以使用该spring.devtools.restart.exclude属性。例如,仅排除/static,/public您将设置以下属性:

spring.devtools.restart.exclude=static/**,public/**

如果要保留这些默认值并添加其他排除项,请改用spring.devtools.restart.additional-exclude属性。

20.2.3 监控其它路径

当你修改了不在类路径下的文件,可能也想你的应用重启或重载。为此,使用spring.devtools.restart.additional-paths属性去配置额外要监控改变的路径。你可以使用前面描述的spring.devtools.restart.exclude来控制其他路径下的更改是触发完全重新启动还是实时重新加载。

20.2.4 禁用重启

如果你不想使用重启特性,你可以使用spring.devtools.restart.enabled属性来禁用它。在大多数情况下,你可以在你的application.properties中设置这个属性(这样做仍会初始化重新启动类加载器,但它不会监视文件更改)。

如果你需要彻底禁用重启的支持(例如,因为它不适用于特定的库),你需要去设置System的属性spring.devtools.restart.enabled=false,在调用pringApplication.run(…)之前,如下案例所示:

public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApp.class, args);}

20.2.5 使用触发器文件

如果使用持续编译更改文件的IDE,则可能更喜欢仅在特定时间触发重新启动。为此,你可以使用“触发文件”,这是一个特殊文件,当你要实际触发重新启动检查时必须对其进行修改。更改文件只会触发检查,并且只有在Devtools检测到必须执行某些操作时才会重新启动。可以手动或使用IDE插件来更新触发文件。

要使用触发文件,请将spring.devtools.restart.trigger-file属性设置为触发文件的路径。

你可能希望将其设置spring.devtools.restart.trigger-file为全局设置,以便所有项目都以相同的方式运行。

20.2.6 自定义重启类加载器

如前面Restart vs Reload章节所述,重启功能是通过使用两个类加载器实现的。大部分应用,此方法效果很好。但是,有时可能会导致类加载问题。

默认情况下,IDE中任何打开的项目都使用“重新启动”类加载器加载,而任何常规.jar文件都使用“基本”类加载器加载。如果你在多模块项目上工作,并且并非每个模块都导入到IDE中,则可能需要自定义内容。为此,你可以创建一个META-INF/spring-devtools.properties文件。

该spring-devtools.properties文件可以包含以restart.exclude和restart.include开头的属性。该include元素是应该被拉高到“重启”类加载器的项目,以及exclude要素是应该向下推入“基础”类加载器的项目。该属性的值是一个应用于类路径的正则表达式模式,如以下示例所示:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jarrestart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

所有属性键都必须是唯一的。只要一个属性以restart.include.或restart.exclude.开头就可以考虑。

所有META-INF/spring-devtools.properties从类路径加载。你可以将文件打包到项目内部或项目使用的库中。

20.2.7 已知限制

重新启动功能不适用于通过使用标准反序列化的对象ObjectInputStream。如果你需要反序列化的数据,你可能需要使用Spring的ConfigurableObjectInputStream结合Thread.currentThread().getContextClassLoader()。

不幸的是,一些第三方库在不考虑上下文类加载器的情况下反序列化。如果发现这样的问题,则需要向原始作者请求修复。

20.3 LiveReload

spring-boot-devtools模块包括一个嵌入式LiveReload服务器,该服务器可用于在更改资源时触发浏览器刷新。可从livereload.com免费获得适用于Chrome,Firefox和Safari的LiveReload浏览器扩展 。

如果当你的应用程序运行时,你不想启动LiveReload服务,可以设置spring.devtools.livereload.enabled=false。

同一时间你只能运行一个LiveReload服务。在启动你的应用程序之前,确保没有其它的LiveReload服务在运行。如果你多次从IDE启动应用程序,只有第一个LiveReload支持。

20.4 全局设定

你可以通过添加一个文件名为spring-boot-devtools.properties你的$HOME文件夹(注意:文件名开头“.”),来配置全局devtools设置 。添加到此文件的任何属性都将应用于使用devtools的计算机上的所有springboot应用程序。例如,要将重启配置为始终使用触发文件,你可以添加以下属性:

~/.spring-boot-devtools.properties.

spring.devtools.reload.trigger-file=.reloadtrigger

激活的配置文件.spring-boot-devtools.properties不会影响特定于配置文件的配置文件的加载。

20.5 远程应用

springboot开发人员工具不仅限于本地开发。远程运行应用程序时,你还可以使用多种功能。选择加入远程支持。要启用它,你需要确保已将devtools其包含在重新打包的存档中,如以下清单所示:

org.springframework.boot
spring-boot-maven-plugin
false

然后,你需要设置一个spring.devtools.remote.secret属性,如以下示例所示:

spring.devtools.remote.secret=mysecret

spring-boot-devtools在远程应用程序上启用存在安全风险。你永远不要在生产部署上启用支持。

远程devtools支持分为两个部分:接受连接的服务器端端点和在IDE中运行的客户端应用程序。spring.devtools.remote.secret设置属性后,将自动启用服务器组件。客户端组件必须手动启动。

20.5.1 运行远程客户端应用程序

远程客户端应用程序旨在在你的IDE中运行。你需要org.springframework.boot.devtools.RemoteSpringApplication使用与所连接的远程目录相同的类路径来运行。应用程序的唯一必需参数是它连接到的远程URL。

例如,如果你使用的是Eclipse或STS,并且有一个my-app已部署到Cloud Foundry的项目,则应执行以下操作:

  • 选择Run Configurations…从Run菜单。
  • 创建一个新的Java Application “launch configuration”。
  • 浏览该my-app项目。
  • 使用org.springframework.boot.devtools.RemoteSpringApplication作为主类。
  • 添加https://myapp.cfapps.io到Program arguments(或任何你的远程URL)。

正在运行的远程客户端可能类似于以下清单:

.   ____          _                                              __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \ \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / / =========|_|==============|___/===================================/_/_/_/ :: Spring Boot Remote :: 2.1.5.RELEASE2015-06-10 18:25:06.632  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools)2015-06-10 18:25:06.671  INFO 14938 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy2015-06-10 18:25:07.043  WARN 14938 --- [           main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.2015-06-10 18:25:07.074  INFO 14938 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 357292015-06-10 18:25:07.130  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)

因为远程客户端使用与真实应用程序相同的类路径,所以它可以直接读取应用程序属性。这就是spring.devtools.remote.secret读取属性并将其传递给服务器进行身份验证的方式。

始终建议将其https://用作连接协议,以便对通信进行加密并且不能截获密码。

如果你需要使用代理来访问远程应用程序,请配置spring.devtools.remote.proxy.host和spring.devtools.remote.proxy.port属性。

20.5.2 远程更新

远程客户端以与本地重新启动相同的方式监视应用程序类路径中的更改。任何更新的资源都会推送到远程应用程序,并且(如果需要)会触发重新启动。如果你迭代使用本地没有的云服务的功能,这将很有帮助。通常,远程更新和重新启动比完整的重建和部署周期要快得多。

仅在远程客户端正在运行时监视文件。如果在启动远程客户端之前更改文件,则不会将其推送到远程服务器。

21. 打包你的生产申请

可执行jar可以用于生产部署。由于它们是独立的,因此它们也非常适合基于云的部署。

对于其他“生产准备就绪”功能,例如运行状况,审核和度量标准REST或JMX端点,请考虑添加spring-boot-actuator。有关详细信息,请参见 第五部分“Spring Boot执行器:生产就绪功能”。

22. 接下来阅读什么

现在,你应该了解如何使用springboot以及应遵循的一些最佳实践。现在,你可以继续深入了解特定的springboot功能,或者可以跳过并阅读有关springboot的“生产就绪”方面的信息。

关注我

转载地址:https://blog.csdn.net/XiaMen_BuYu/article/details/105425107 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:设计模式前言-设计原则、面向对象和Java语言特性
下一篇:翻译《Spring Boot Reference Guide》-第二单元.入门

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月27日 13时37分46秒