本节更详细地介绍了如何使用 Spring Boot。它涵盖了诸如构建系统、自动配置以及如何运行应用程序等主题。我们还介绍了一些 Spring Boot 最佳实践。尽管 Spring Boot 没有什么特别之处(它只是您可以使用的另一个库),但有一些建议可以让您的开发过程更轻松一些。
如果您刚开始使用 Spring Boot,您可能应该在深入了解本节之前阅读入门指南。
1. 构建系统
强烈建议您选择支持依赖管理并且可以使用发布到“Maven Central”存储库的工件的构建系统。我们建议您选择 Maven 或 Gradle。可以让 Spring Boot 与其他构建系统(例如 Ant)一起工作,但它们并没有得到特别好的支持。
1.1。依赖管理
Spring Boot 的每个版本都提供了它支持的依赖项的精选列表。实际上,您不需要在构建配置中为任何这些依赖项提供版本,因为 Spring Boot 会为您管理。当您升级 Spring Boot 本身时,这些依赖项也会以一致的方式升级。
如果需要,您仍然可以指定版本并覆盖 Spring Boot 的建议。 |
精选列表包含您可以与 Spring Boot 一起使用的所有 Spring 模块以及第三方库的精致列表。该列表以标准材料清单 ( spring-boot-dependencies
) 的形式提供,可与Maven和Gradle一起使用。
Spring Boot 的每个版本都与 Spring Framework 的基本版本相关联。我们强烈建议您不要指定其版本。 |
1.4. 蚂蚁
可以使用 Apache Ant+Ivy 构建 Spring Boot 项目。“ spring-boot-antlib
AntLib”模块也可用于帮助 Ant 创建可执行的 jar。
要声明依赖项,典型的ivy.xml
文件类似于以下示例:
<ivy-module version="2.0">
<info organisation="org.springframework.boot" module="spring-boot-sample-ant" />
<configurations>
<conf name="compile" description="everything needed to compile this module" />
<conf name="runtime" extends="compile" description="everything needed to run this module" />
</configurations>
<dependencies>
<dependency org="org.springframework.boot" name="spring-boot-starter"
rev="${spring-boot.version}" conf="compile" />
</dependencies>
</ivy-module>
一个典型build.xml
的例子如下所示:
<project
xmlns:ivy="antlib:org.apache.ivy.ant"
xmlns:spring-boot="antlib:org.springframework.boot.ant"
name="myapp" default="build">
<property name="spring-boot.version" value="2.7.1" />
<target name="resolve" description="--> retrieve dependencies with ivy">
<ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />
</target>
<target name="classpaths" depends="resolve">
<path id="compile.classpath">
<fileset dir="lib/compile" includes="*.jar" />
</path>
</target>
<target name="init" depends="classpaths">
<mkdir dir="build/classes" />
</target>
<target name="compile" depends="init" description="compile">
<javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" />
</target>
<target name="build" depends="compile">
<spring-boot:exejar destfile="build/myapp.jar" classes="build/classes">
<spring-boot:lib>
<fileset dir="lib/runtime" />
</spring-boot:lib>
</spring-boot:exejar>
</target>
</project>
如果您不想使用该spring-boot-antlib 模块,请参阅howto.html “How-to”。
|
1.5。开胃菜
Starters 是一组方便的依赖描述符,您可以将其包含在应用程序中。您可以获得所需的所有 Spring 和相关技术的一站式商店,而无需搜索示例代码和复制粘贴加载的依赖描述符。例如,如果您想开始使用 Spring 和 JPA 进行数据库访问,请将spring-boot-starter-data-jpa
依赖项包含在您的项目中。
启动器包含许多依赖项,您需要这些依赖项让项目快速启动并运行,并具有一致的、受支持的托管传递依赖项集。
以下应用程序启动器由该org.springframework.boot
组下的 Spring Boot 提供:
姓名 | 描述 |
---|---|
核心启动器,包括自动配置支持、日志记录和 YAML |
|
使用 Apache ActiveMQ 进行 JMS 消息传递的启动器 |
|
使用 Spring AMQP 和 Rabbit MQ 的入门 |
|
使用 Spring AOP 和 AspectJ 进行面向方面编程的入门者 |
|
使用 Apache Artemis 的 JMS 消息传递启动器 |
|
使用 Spring Batch 的入门者 |
|
使用 Spring Framework 的缓存支持的 Starter |
|
使用 Cassandra 分布式数据库和 Spring Data Cassandra 的入门者 |
|
使用 Cassandra 分布式数据库和 Spring Data Cassandra Reactive 的入门者 |
|
使用 Couchbase 面向文档的数据库和 Spring Data Couchbase 的初学者 |
|
使用 Couchbase 面向文档的数据库和 Spring Data Couchbase Reactive 的初学者 |
|
使用 Elasticsearch 搜索和分析引擎和 Spring Data Elasticsearch 的入门者 |
|
使用 Spring Data JDBC 的入门者 |
|
将 Spring Data JPA 与 Hibernate 一起使用的入门 |
|
使用 Spring Data LDAP 的入门者 |
|
使用 MongoDB 面向文档的数据库和 Spring Data MongoDB 的入门 |
|
使用 MongoDB 面向文档的数据库和 Spring Data MongoDB Reactive 的入门 |
|
使用 Neo4j 图形数据库和 Spring Data Neo4j 的入门 |
|
使用 Spring Data R2DBC 的入门者 |
|
将 Redis 键值数据存储与 Spring Data Redis 和 Lettuce 客户端一起使用的入门 |
|
使用带有 Spring Data Redis 反应式和 Lettuce 客户端的 Redis 键值数据存储的启动器 |
|
使用 Spring Data REST 通过 REST 公开 Spring Data 存储库的启动器 |
|
使用 FreeMarker 视图构建 MVC Web 应用程序的 Starter |
|
使用 Spring GraphQL 构建 GraphQL 应用程序的 Starter |
|
使用 Groovy 模板视图构建 MVC Web 应用程序的 Starter |
|
使用 Spring MVC 和 Spring HATEOAS 构建基于超媒体的 RESTful Web 应用程序的 Starter |
|
使用 Spring Integration 的入门者 |
|
使用 JDBC 和 HikariCP 连接池的 Starter |
|
使用 JAX-RS 和 Jersey 构建 RESTful Web 应用程序的初学者。一个替代方案 |
|
使用 jOOQ 通过 JDBC 访问 SQL 数据库的入门程序。替代 |
|
读写json的starter |
|
使用 Atomikos 进行 JTA 事务的启动器 |
|
使用 Java Mail 和 Spring Framework 的电子邮件发送支持的 Starter |
|
使用 Mustache 视图构建 Web 应用程序的入门程序 |
|
使用 Spring Security 的 OAuth2/OpenID Connect 客户端功能的入门者 |
|
使用 Spring Security 的 OAuth2 资源服务器特性的入门者 |
|
使用 Quartz 调度器的启动器 |
|
用于构建 RSocket 客户端和服务器的 Starter |
|
使用 Spring Security 的入门者 |
|
使用包括 JUnit Jupiter、Hamcrest 和 Mockito 在内的库测试 Spring Boot 应用程序的 Starter |
|
使用 Thymeleaf 视图构建 MVC Web 应用程序的启动器 |
|
使用带有 Hibernate Validator 的 Java Bean Validation 的 Starter |
|
使用 Spring MVC 构建 Web 应用程序的入门程序,包括 RESTful 应用程序。使用 Tomcat 作为默认的嵌入式容器 |
|
使用 Spring Web 服务的入门者 |
|
使用 Spring Framework 的 Reactive Web 支持构建 WebFlux 应用程序的启动器 |
|
使用 Spring Framework 的 WebSocket 支持构建 WebSocket 应用程序的 Starter |
除了应用程序启动器之外,以下启动器可用于添加生产就绪功能:
姓名 | 描述 |
---|---|
使用 Spring Boot 的 Actuator 的 Starter,它提供了生产就绪的特性来帮助你监控和管理你的应用程序 |
最后,Spring Boot 还包括以下启动器,如果您想排除或交换特定的技术方面,可以使用它们:
姓名 | 描述 |
---|---|
使用 Jetty 作为嵌入式 servlet 容器的启动器。一个替代方案 |
|
使用 Log4j2 进行日志记录的启动器。一个替代方案 |
|
使用 Logback 进行日志记录的启动器。默认日志记录启动器 |
|
使用 Reactor Netty 作为嵌入式响应式 HTTP 服务器的启动器。 |
|
使用 Tomcat 作为嵌入式 servlet 容器的启动器。使用的默认 servlet 容器启动器 |
|
使用 Undertow 作为嵌入式 servlet 容器的启动器。一个替代方案 |
要了解如何交换技术方面,请参阅交换 Web 服务器和日志系统的操作指南文档。
有关其他社区贡献的初学者列表,请参阅GitHub 上模块
中的README 文件。spring-boot-starters |
2. 构建你的代码
Spring Boot 不需要任何特定的代码布局即可工作。但是,有一些最佳实践会有所帮助。
2.1。使用“默认”包
当一个类不包含package
声明时,它被认为在“默认包”中。通常不鼓励使用“默认包”,应避免使用。它可能会导致使用@ComponentScan
、@ConfigurationPropertiesScan
、@EntityScan
或@SpringBootApplication
注释的 Spring Boot 应用程序出现特殊问题,因为每个 jar 中的每个类都被读取。
我们建议您遵循 Java 推荐的包命名约定并使用反向域名(例如,com.example.project )。
|
2.2. 定位主应用程序类
我们通常建议您将主应用程序类定位在其他类之上的根包中。@SpringBootApplication
注释通常放在你的主类上,它隐含地为某些项目定义了一个基本的“搜索包” 。例如,如果您正在编写 JPA 应用程序,则使用带@SpringBootApplication
注释的类的包来搜索@Entity
项目。使用根包还允许组件扫描仅应用于您的项目。
如果您不想使用@SpringBootApplication ,它导入的@EnableAutoConfiguration 和@ComponentScan 注释定义了该行为,因此您也可以使用它们。
|
下面的清单显示了一个典型的布局:
com +- 例子 +- 我的应用程序 +- MyApplication.java | +- 客户 | +- 客户.java | +- 客户控制器.java | +- 客户服务.java | +- CustomerRepository.java | +- 订购 +- 订单.java +- OrderController.java +- OrderService.java +- OrderRepository.java
该MyApplication.java
文件将声明该main
方法以及 basic @SpringBootApplication
,如下所示:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication
class MyApplication
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
3. 配置类
Spring Boot 支持基于 Java 的配置。尽管可以SpringApplication
与 XML 源一起使用,但我们通常建议您的主要源是单个@Configuration
类。通常,定义该main
方法的类是主要的候选者@Configuration
。
互联网上已经发布了许多使用 XML 配置的 Spring 配置示例。如果可能,请始终尝试使用等效的基于 Java 的配置。搜索Enable* 注释可能是一个很好的起点。
|
4. 自动配置
Spring Boot 自动配置尝试根据您添加的 jar 依赖项自动配置您的 Spring 应用程序。例如,如果HSQLDB
在您的类路径中,并且您没有手动配置任何数据库连接 bean,那么 Spring Boot 会自动配置一个内存数据库。
@EnableAutoConfiguration
您需要通过将或@SpringBootApplication
注释添加到您的@Configuration
类之一来选择自动配置。
您应该只添加一个@SpringBootApplication 或@EnableAutoConfiguration 注释。我们通常建议您仅将其中一个添加到您的小学@Configuration 课程中。
|
4.1。逐步取代自动配置
自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置来替换自动配置的特定部分。例如,如果您添加自己的DataSource
bean,则默认的嵌入式数据库支持会退出。
如果您需要了解当前正在应用什么自动配置以及原因,请使用--debug
开关启动您的应用程序。这样做可以为选择的核心记录器启用调试日志,并将条件报告记录到控制台。
4.2. 禁用特定的自动配置类
如果您发现正在应用您不想要的特定自动配置类,您可以使用 exclude 属性@SpringBootApplication
来禁用它们,如下例所示:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}
@SpringBootApplication(exclude = [DataSourceAutoConfiguration::class])
class MyApplication
如果类不在类路径上,您可以使用excludeName
注解的属性并指定完全限定名称。如果您更喜欢使用@EnableAutoConfiguration
而不是@SpringBootApplication
,exclude
并且excludeName
也可用。最后,您还可以使用该spring.autoconfigure.exclude
属性控制要排除的自动配置类的列表。
您可以在注释级别和使用属性定义排除项。 |
尽管自动配置类是public ,但被认为是公共 API 的类的唯一方面是可用于禁用自动配置的类的名称。这些类的实际内容,例如嵌套配置类或 bean 方法仅供内部使用,我们不建议直接使用它们。
|
5. Spring Beans 和依赖注入
您可以自由使用任何标准 Spring Framework 技术来定义您的 bean 及其注入的依赖项。我们通常建议使用构造函数注入来连接依赖项并@ComponentScan
查找 bean。
如果您按照上面的建议构建代码(将应用程序类放在顶级包中),则可以添加@ComponentScan
不带任何参数或使用@SpringBootApplication
隐式包含它的注释。您的所有应用程序组件(@Component
、@Service
、@Repository
、@Controller
等)都会自动注册为 Spring Bean。
以下示例显示了一个@Service
使用构造函数注入来获取所需RiskAssessor
bean 的 Bean:
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
@Service
class MyAccountService(private val riskAssessor: RiskAssessor) : AccountService
如果一个 bean 有多个构造函数,你需要标记你希望 Spring 使用的那个@Autowired
:
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
private final PrintStream out;
@Autowired
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
this.out = System.out;
}
public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
this.riskAssessor = riskAssessor;
this.out = out;
}
// ...
}
@Service
class MyAccountService : AccountService {
private val riskAssessor: RiskAssessor
private val out: PrintStream
@Autowired
constructor(riskAssessor: RiskAssessor) {
this.riskAssessor = riskAssessor
out = System.out
}
constructor(riskAssessor: RiskAssessor, out: PrintStream) {
this.riskAssessor = riskAssessor
this.out = out
}
// ...
}
请注意使用构造函数注入如何让该riskAssessor 字段标记为final ,表明它不能随后更改。
|
6.使用@SpringBootApplication注解
许多 Spring Boot 开发人员喜欢他们的应用程序使用自动配置、组件扫描并能够在他们的“应用程序类”上定义额外的配置。可以使用单个@SpringBootApplication
注释来启用这三个功能,即:
-
@EnableAutoConfiguration
: 启用Spring Boot 的自动配置机制 -
@ComponentScan
@Component
:对应用程序所在的包启用扫描(见最佳实践) -
@SpringBootConfiguration
: 允许在上下文中注册额外的 bean 或导入额外的配置类。Spring 标准的替代方案@Configuration
,可帮助您在集成测试中进行配置检测。
// Same as @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
// same as @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
@SpringBootApplication
class MyApplication
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
@SpringBootApplication 还提供别名来自定义 和 的@EnableAutoConfiguration 属性@ComponentScan 。
|
这些功能都不是强制性的,您可以选择将此单个注释替换为它启用的任何功能。例如,您可能不想在应用程序中使用组件扫描或配置属性扫描: java
科特林
在这个示例中, |
7. 运行你的应用程序
将应用程序打包为 jar 并使用嵌入式 HTTP 服务器的最大优势之一是您可以像运行其他应用程序一样运行应用程序。该示例适用于调试 Spring Boot 应用程序。您不需要任何特殊的 IDE 插件或扩展。
本节仅介绍基于 jar 的打包。如果您选择将应用程序打包为 war 文件,请参阅您的服务器和 IDE 文档。 |
7.1。从 IDE 运行
您可以从 IDE 将 Spring Boot 应用程序作为 Java 应用程序运行。但是,您首先需要导入您的项目。导入步骤因您的 IDE 和构建系统而异。大多数 IDE 可以直接导入 Maven 项目。例如,Eclipse 用户可以从菜单中选择Import…
→ 。Existing Maven Projects
File
如果您不小心运行了两次 Web 应用程序,您会看到“端口已在使用”错误。Spring Tools 用户可以使用Relaunch 按钮而不是Run 按钮来确保关闭任何现有实例。
|
7.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
7.3. 使用 Maven 插件
Spring Boot Maven 插件包含一个run
可用于快速编译和运行应用程序的目标。应用程序以分解的形式运行,就像在您的 IDE 中一样。以下示例显示了运行 Spring Boot 应用程序的典型 Maven 命令:
$ mvn spring-boot:run
您可能还想使用MAVEN_OPTS
操作系统环境变量,如以下示例所示:
$ export MAVEN_OPTS=-Xmx1024m
8. 开发者工具
Spring Boot 包含一组额外的工具,可以使应用程序开发体验更加愉快。该spring-boot-devtools
模块可以包含在任何项目中,以提供额外的开发时功能。要包含 devtools 支持,请将模块依赖项添加到您的构建中,如下面的 Maven 和 Gradle 清单所示:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
Devtools 可能会导致类加载问题,尤其是在多模块项目中。 诊断类加载问题解释了如何诊断和解决它们。 |
运行完全打包的应用程序时,开发人员工具会自动禁用。如果你的应用程序是从一个特殊的类加载器启动的,java -jar 或者它是从一个特殊的类加载器启动的,那么它被认为是一个“生产应用程序”。您可以使用spring.devtools.restart.enabled 系统属性来控制此行为。要启用 devtools,无论用于启动应用程序的类加载器如何,设置-Dspring.devtools.restart.enabled=true 系统属性。这不能在运行 devtools 存在安全风险的生产环境中完成。要禁用 devtools,请排除依赖项或设置-Dspring.devtools.restart.enabled=false 系统属性。
|
在 Maven 中将依赖项标记为可选或使用developmentOnly Gradle 中的配置(如上所示)可防止 devtools 被传递到使用您的项目的其他模块。
|
默认情况下,重新打包的存档不包含 devtools。如果你想使用某个远程 devtools 功能,你需要包含它。使用 Maven 插件时,将excludeDevtools 属性设置为false . 使用 Gradle 插件时,配置任务的类路径以包含developmentOnly 配置。
|
8.1。诊断类加载问题
如Restart vs Reload部分所述,重新启动功能是通过使用两个类加载器实现的。对于大多数应用程序,这种方法效果很好。但是,它有时会导致类加载问题,尤其是在多模块项目中。
要诊断类加载问题是否确实是由 devtools 及其两个类加载器引起的,请尝试禁用 restart。如果这解决了您的问题,请自定义重新启动类加载器以包含您的整个项目。
8.2. 属性默认值
Spring Boot 支持的几个库使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。此外,Spring MVC 可以在提供静态资源时将 HTTP 缓存标头添加到响应中。
虽然缓存在生产中非常有用,但在开发过程中可能会适得其反,使您无法看到刚刚在应用程序中所做的更改。因此,spring-boot-devtools 默认禁用缓存选项。
缓存选项通常由application.properties
文件中的设置配置。例如,Thymeleaf 提供该spring.thymeleaf.cache
属性。该模块无需手动设置这些属性,而是spring-boot-devtools
自动应用合理的开发时配置。
下表列出了所有应用的属性:
姓名 | 默认值 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果您不希望应用属性默认值,您spring.devtools.add-properties 可以false 在application.properties .
|
因为您在开发 Spring MVC 和 Spring WebFlux 应用程序时需要有关 Web 请求的更多信息,所以开发人员工具建议您为日志记录组启用DEBUG
日志记录。web
这将为您提供有关传入请求、正在处理它的处理程序、响应结果和其他详细信息的信息。如果您希望记录所有请求详细信息(包括潜在的敏感信息),您可以打开spring.mvc.log-request-details
或spring.codec.log-request-details
配置属性。
8.3. 自动重启
spring-boot-devtools
每当类路径上的文件更改时,使用自动重新启动的应用程序。在 IDE 中工作时,这可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。默认情况下,类路径上指向目录的任何条目都会被监视更改。请注意,某些资源,例如静态资产和视图模板,不需要重新启动应用程序。
如果您使用构建插件使用 Maven 或 Gradle 重新启动,则必须将forking 设置保留为enabled . 如果禁用分叉,将不会创建 devtools 使用的隔离应用程序类加载器,并且重新启动将无法正常运行。
|
与 LiveReload 一起使用时,自动重启效果很好。 有关详细信息,请参阅 LiveReload 部分。如果您使用 JRebel,则会禁用自动重新启动以支持动态类重新加载。其他 devtools 功能(例如 LiveReload 和属性覆盖)仍然可以使用。 |
DevTools 依赖应用程序上下文的关闭挂钩在重新启动期间将其关闭。SpringApplication.setRegisterShutdownHook(false) 如果您禁用了关闭挂钩 ( )
,它将无法正常工作。 |
DevTools 需要自ResourceLoader 定义ApplicationContext . 如果您的应用程序已经提供了一个,它将被包装。不支持
直接覆盖 上的getResource 方法。ApplicationContext |
使用 AspectJ 编织时不支持自动重启。 |
8.3.1. 记录条件评估中的变化
默认情况下,每次您的应用程序重新启动时,都会记录显示条件评估增量的报告。当您进行更改(例如添加或删除 bean 和设置配置属性)时,该报告会显示对应用程序自动配置的更改。
要禁用报告的日志记录,请设置以下属性:
spring.devtools.restart.log-condition-evaluation-delta=false
spring:
devtools:
restart:
log-condition-evaluation-delta: false
8.3.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:
exclude: "static/**,public/**"
如果要保留这些默认值并添加其他排除项,请改用该spring.devtools.restart.additional-exclude 属性。
|
8.3.4. 禁用重启
如果您不想使用重启功能,可以使用该spring.devtools.restart.enabled
属性禁用它。在大多数情况下,您可以在您的中设置此属性application.properties
(这样做仍然会初始化重新启动类加载器,但它不会监视文件更改)。
如果您需要完全禁用重启支持(例如,因为它不适用于特定库),则需要在调用之前将spring.devtools.restart.enabled
System
属性设置为 ,如下例所示:false
SpringApplication.run(…)
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApplication.class, args);
}
}
@SpringBootApplication
object MyApplication {
@JvmStatic
fun main(args: Array<String>) {
System.setProperty("spring.devtools.restart.enabled", "false")
SpringApplication.run(MyApplication::class.java, *args)
}
}
8.3.5。使用触发文件
如果您使用持续编译更改文件的 IDE,您可能更愿意仅在特定时间触发重新启动。为此,您可以使用“触发文件”,这是一个特殊文件,当您想要实际触发重新启动检查时必须对其进行修改。
对文件的任何更新都会触发检查,但只有在 Devtools 检测到它有事情要做时才会真正发生重新启动。 |
要使用触发器文件,请将spring.devtools.restart.trigger-file
属性设置为触发器文件的名称(不包括任何路径)。触发器文件必须出现在您的类路径中的某处。
例如,如果您有一个具有以下结构的项目:
源代码 +- 主要 +- 资源 +- .reloadtrigger
那么您的trigger-file
财产将是:
spring.devtools.restart.trigger-file=.reloadtrigger
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
现在仅在src/main/resources/.reloadtrigger
更新时才会重新启动。
您可能希望设置spring.devtools.restart.trigger-file 为全局设置,以便您的所有项目都以相同的方式运行。
|
某些 IDE 具有使您无需手动更新触发器文件的功能。
Spring Tools for Eclipse和IntelliJ IDEA(终极版)都有这样的支持。使用 Spring Tools,您可以使用控制台视图中的“重新加载”按钮(只要您trigger-file
的名称为.reloadtrigger
)。对于 IntelliJ IDEA,您可以按照其文档中的说明进行操作。
8.3.6. 自定义重启类加载器
正如前面在重新启动与重新加载部分中所述,重新启动功能是通过使用两个类加载器来实现的。如果这会导致问题,您可能需要自定义由哪个类加载器加载的内容。
默认情况下,IDE 中任何打开的项目都使用“restart”类加载器加载,任何常规.jar
文件都使用“base”类加载器加载。如果您使用mvn spring-boot:run
or也是如此gradle bootRun
:包含您的项目@SpringBootApplication
使用“restart”类加载器加载,其他所有内容都使用“base”类加载器加载。
您可以通过创建META-INF/spring-devtools.properties
文件来指示 Spring Boot 使用不同的类加载器加载项目的一部分。该spring-devtools.properties
文件可以包含以restart.exclude
和为前缀的属性restart.include
。include
元素是应该被拉入“重新启动”类加载器的exclude
项目,元素是应该被推入“基础”类加载器的项目。该属性的值是应用于类路径的正则表达式模式,如以下示例所示:
restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\\.]+\\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\\.]+\\.jar
restart:
exclude:
companycommonlibs: "/mycorp-common-[\\w\\d-\\.]+\\.jar"
include:
projectcommon: "/mycorp-myproj-[\\w\\d-\\.]+\\.jar"
所有属性键都必须是唯一的。只要一个属性以restart.include. or开头restart.exclude. 就被考虑。
|
类路径中的所有META-INF/spring-devtools.properties 内容都已加载。您可以在项目中或项目使用的库中打包文件。
|
8.4. 实时重载
该spring-boot-devtools
模块包括一个嵌入式 LiveReload 服务器,可用于在资源更改时触发浏览器刷新。LiveReload 浏览器扩展可从livereload.com免费获得,适用于 Chrome、Firefox 和 Safari 。
如果您不想在应用程序运行时启动 LiveReload 服务器,您可以将该spring.devtools.livereload.enabled
属性设置为false
.
您一次只能运行一个 LiveReload 服务器。在启动您的应用程序之前,请确保没有其他 LiveReload 服务器正在运行。如果您从 IDE 启动多个应用程序,则只有第一个具有 LiveReload 支持。 |
要在文件更改时触发 LiveReload,必须启用 自动重启。 |
8.5。全局设置
您可以通过将以下任何文件添加到$HOME/.config/spring-boot
目录来配置全局 devtools 设置:
-
spring-boot-devtools.properties
-
spring-boot-devtools.yaml
-
spring-boot-devtools.yml
添加到这些文件的任何属性都适用于您机器上使用 devtools 的所有Spring Boot 应用程序。例如,要将重新启动配置为始终使用触发器文件,您可以将以下属性添加到spring-boot-devtools
文件中:
spring.devtools.restart.trigger-file=.reloadtrigger
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
默认情况下,$HOME
是用户的主目录。要自定义此位置,请设置SPRING_DEVTOOLS_HOME
环境变量或spring.devtools.home
系统属性。
如果在 中找不到 devtools 配置文件,则会在目录$HOME/.config/spring-boot 的根$HOME 目录中搜索.spring-boot-devtools.properties 文件是否存在。$HOME/.config/spring-boot 这允许您与不支持该位置
的旧版 Spring Boot 上的应用程序共享 devtools 全局配置。 |
devtools 属性/yaml 文件不支持配置文件。 激活的任何配置文件 |
8.5.1。配置文件系统观察程序
FileSystemWatcher以特定时间间隔轮询类更改,然后等待预定义的静默期以确保没有更多更改。由于 Spring Boot 完全依赖 IDE 来编译文件并将其复制到 Spring Boot 可以读取它们的位置,因此您可能会发现有时某些更改在 devtools 重新启动应用程序时不会反映出来。如果您经常观察到此类问题,请尝试将spring.devtools.restart.poll-interval
和spring.devtools.restart.quiet-period
参数增加到适合您的开发环境的值:
spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s
spring:
devtools:
restart:
poll-interval: "2s"
quiet-period: "1s"
现在每 2 秒轮询一次受监视的类路径目录以进行更改,并保持 1 秒的静默期以确保没有额外的类更改。
8.6. 远程应用程序
Spring Boot 开发者工具不仅限于本地开发。您还可以在远程运行应用程序时使用多种功能。远程支持是可选的,因为启用它可能会带来安全风险。只有在受信任的网络上运行或使用 SSL 保护时才应启用它。如果您无法使用这些选项,则不应使用 DevTools 的远程支持。您永远不应该在生产部署中启用支持。
要启用它,您需要确保它devtools
包含在重新打包的存档中,如下面的清单所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
</plugins>
</build>
然后你需要设置spring.devtools.remote.secret
属性。像任何重要的密码或秘密一样,该值应该是唯一且强大的,以至于无法猜测或暴力破解。
远程 devtools 支持分两部分提供:接受连接的服务器端端点和在 IDE 中运行的客户端应用程序。spring.devtools.remote.secret
设置属性时,服务器组件会自动启用。客户端组件必须手动启动。
Spring WebFlux 应用程序不支持远程开发工具。 |
8.6.1. 运行远程客户端应用程序
远程客户端应用程序旨在从您的 IDE 中运行。您需要org.springframework.boot.devtools.RemoteSpringApplication
使用与您连接到的远程项目相同的类路径运行。应用程序的唯一必需参数是它连接到的远程 URL。
例如,如果您使用 Eclipse 或 Spring Tools,并且您有一个my-app
已部署到 Cloud Foundry 的名为的项目,您将执行以下操作:
-
Run Configurations…
从Run
菜单中选择。 -
创建一个新的
Java Application
“启动配置”。 -
浏览
my-app
项目。 -
用
org.springframework.boot.devtools.RemoteSpringApplication
作主类。 -
添加
https://myapp.cfapps.io
到Program arguments
(或任何您的远程 URL)。
正在运行的远程客户端可能类似于以下列表:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \ \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / / =========|_|===============|___/===================== ===============/_/_/_/ :: Spring Boot 远程 :: 2.7.1 2015-06-10 18:25:06.632 INFO 14938 --- [main] osbdevtools.RemoteSpringApplication:在 PID 14938 的 pwmbp 上启动 RemoteSpringApplication(/Users/pwebb/projects/spring-boot/code/spring-boot-project/spring -boot-devtools/target/classes 由 pwebb 在 /Users/pwebb/projects/spring-boot/code 启动) 2015-06-10 18:25:06.671 INFO 14938 --- [main] scaAnnotationConfigApplicationContext:刷新 org.spring [电子邮件保护] 2a17b7b6:启动日期 [2015 年 6 月 10 日星期三 18:25:06 PDT];上下文层次的根 2015-06-10 18:25:07.043 WARN 14938 --- [main] osbdrcRemoteClientConfiguration:与 http://localhost:8080 的连接不安全。您应该使用以“https://”开头的 URL。 2015-06-10 18:25:07.074 INFO 14938 --- [main] osbdaOptionalLiveReloadServer:LiveReload 服务器正在端口 35729 上运行 2015-06-10 18:25:07.130 INFO 14938 --- [main] osbdevtools.RemoteSpringApplication:在 0.74 秒内启动 RemoteSpringApplication(JVM 运行 1.105)
因为远程客户端使用与真实应用程序相同的类路径,它可以直接读取应用程序属性。这是spring.devtools.remote.secret 读取属性并将其传递给服务器进行身份验证的方式。
|
始终建议将其https:// 用作连接协议,以便对流量进行加密并且无法截获密码。
|
如果您需要使用代理访问远程应用程序,请配置spring.devtools.remote.proxy.host 和spring.devtools.remote.proxy.port 属性。
|
8.6.2. 远程更新
远程客户端以与本地重新启动相同的方式监视您的应用程序类路径的更改。任何更新的资源都会被推送到远程应用程序并(如果需要)触发重新启动。如果您迭代使用本地没有的云服务的功能,这会很有帮助。通常,远程更新和重新启动比完整的重建和部署周期快得多。
在较慢的开发环境上,可能会出现静默期不够,类的变化可能会分批进行。上传第一批类更改后,服务器会重新启动。下一批无法发送到应用程序,因为服务器正在重新启动。
这通常表现为RemoteSpringApplication
日志中有关未能上传某些类的警告以及随后的重试。但这也可能导致应用程序代码不一致,在第一批更改上传后无法重启。如果您经常观察到此类问题,请尝试将spring.devtools.restart.poll-interval
和spring.devtools.restart.quiet-period
参数增加到适合您的开发环境的值。请参阅配置文件系统观察程序部分以配置这些属性。
只有在远程客户端运行时才会监控文件。如果您在启动远程客户端之前更改了文件,则不会将其推送到远程服务器。 |
9. 打包您的生产应用程序
可执行 jar 可用于生产部署。由于它们是独立的,因此它们也非常适合基于云的部署。
对于其他“生产就绪”功能,例如运行状况、审计和度量 REST 或 JMX 端点,请考虑添加spring-boot-actuator
. 有关详细信息,请参见actuator.html。
10.接下来要读什么
您现在应该了解如何使用 Spring Boot 以及应该遵循的一些最佳实践。您现在可以继续深入了解特定的Spring Boot 功能,或者您可以跳过并阅读有关 Spring Boot 的“生产就绪”方面的内容。