使用 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依赖关系)可以同时用于Maven和Gradle。
| 每个 Spring Boot 版本都关联到一个 Spring 框架的基础版本。我们强烈建议您不要指定其版本。 |
1.4. Ant
可以使用Apache Ant+Ivy构建Spring Boot项目。 这Spring靴-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.18" />
<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靴-antlib模块,请参见howto.html“作指南”。 |
1.5. 先发球员
起始描述符是一组方便的依赖描述符,你可以在应用中包含。你可以一站式获取所有 Spring 及相关技术,无需在样本代码中寻找大量依赖描述符。例如,如果你想开始使用 Spring 和 JPA 进行数据库访问,可以包含Spring-boot-starter-data-jpa项目中的依赖性。
起始程序包含了许多你需要快速启动项目并拥有一致且受控的可管理传递依赖所需的依赖。
以下应用起始文件由Spring Boot提供,内容如下:org.springframework.boot群:
| 名称 | 描述 |
|---|---|
核心启动功能,包括自动配置支持、日志记录和 YAML |
|
使用 Apache ActiveMQ 进行 JMS 消息传递的入门 |
|
使用 Spring AMQP 和 Rabbit MQ 的入门程序 |
|
Spring AOP和AspectJ面向切面编程的入门程序 |
|
使用 Apache Artemis 的 JMS 消息发送入门 |
|
使用春季批次的起始剂 |
|
使用 Spring Framework 缓存支持的 Starter |
|
用于使用 Cassandra 分布式数据库和 Spring Data Cassandra 的入门程序 |
|
用于使用 Cassandra 分布式数据库和 Spring Data Cassandra Reactive 的入门工具 |
|
用于使用 Couchbase 文档导向数据库和 Spring Data Couchbase 的 Starter |
|
用于使用 Couchbase 文档导向数据库和 Spring Data Couchbase Reactive 的 Starter |
|
用于使用 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 的起始程序 |
|
Starter 用于使用 Redis 键值数据存储,配合 Spring Data Redis 和 Lettuce 客户端 |
|
使用 Redis 键值数据存储,配合 Spring Data Redis 响应式和 Lettuce 客户端 |
|
使用 Spring Data REST 和 Spring MVC 在 REST 上暴露 Spring Data 仓库的起始程序 |
|
用于使用 FreeMarker 视图构建 MVC 网络应用的 Starter |
|
用 Spring GraphQL 构建 GraphQL 应用的入门工具 |
|
使用 Groovy 模板视图构建 MVC 网页应用的入门 |
|
用于构建基于超媒体的RESTful网页应用的Spring MVC和Spring HATEOAS的入门程序 |
|
使用 Spring 集成的起始程序 |
|
使用 JDBC 搭配 HikariCP 连接池的入门 |
|
用于使用 JAX-RS 和 Jersey 构建 RESTful 网页应用的入门程序。一个替代方案 |
|
使用 jOOQ 访问 JDBC SQL 数据库的入门工具。一个替代方案 |
|
用于读写json的起始程序 |
|
使用 Atomikos 进行 JTA 交易的起始程序 |
|
用于使用 Java Mail 和 Spring Framework 邮件发送支持的 Starter |
|
使用 Mustache 视图构建网页应用的 Starter |
|
用于使用 Spring Security OAuth2/OpenID Connect 客户端功能的入门 |
|
使用 Spring Security OAuth2 资源服务器功能的起始程序 |
|
使用 Quartz 调度器的起始程序 |
|
构建 RSocket 客户端和服务器的入门程序 |
|
使用 Spring Security 的起始工具 |
|
用于测试包含 JUnit Jupiter、Hamcrest 和 Mockito 等库的 Spring Boot 应用的 Starter |
|
用于使用 Thymeleaf 视图构建 MVC 网页应用的 Start。 |
|
使用 Java Bean 验证与 Hibernate Validator 的入门 |
|
使用 Spring MVC 构建网页应用(包括 RESTful)的 Starter。默认嵌入式容器使用 Tomcat |
|
使用 Spring Web Services 的起始程序 |
|
使用 Spring Framework 的响应式网页支持构建 WebFlux 应用的起始程序 |
|
用于使用 Spring Framework 的 MVC WebSocket 支持构建 WebSocket 应用的 Starter |
除了应用程序启动程序外,以下启动程序还可以用于添加生产准备功能:
| 名称 | 描述 |
|---|---|
Spring Boot 的 Actuator 入门,提供生产准备功能,帮助你监控和管理应用 |
最后,Spring Boot还包含以下入门,如果你想排除或替换某些技术细节,可以使用:
| 名称 | 描述 |
|---|---|
用于使用 Jetty 作为嵌入式 servlet 容器的起始工具。一个替代方案 |
|
用Log4j2进行日志记录的起始程序。一个替代方案 |
|
用Logback登录的起始工具。默认日志Starters |
|
用 Reactor Netty 作为嵌入式响应式 HTTP 服务器的起始器。 |
|
用于使用 Tomcat 作为嵌入式 servlet 容器的起始码。默认的servlet容器Starters |
|
用来把Undertow当作嵌入式Servlet容器的入门。一个替代方案 |
2. 构建你的代码
Spring Boot 不需要特定的代码布局才能正常工作。 不过,有一些最佳实践是有帮助的。
2.1. 使用“默认”包
当一个类不包含包声明时,它被视为“默认包”中的一员。
通常不建议使用“默认软件包”,应避免使用。
对于使用@ComponentScan,@ConfigurationPropertiesScan,@EntityScan或@SpringBootApplication注释,因为每个jar的每个类都被读取。
我们建议您遵循 Java 推荐的包命名规范,使用反向域名(例如,com.example.project). |
2.2. 定位主应用类
我们通常建议你把主应用类放在根包里,而不是其他类。
这@SpringBootApplication注解通常会放在你的主职业上,并且隐含地定义了某些物品的基础“搜索包”。
例如,如果你正在编写JPA应用程序,这个包@SpringBootApplication注释类用于搜索@Entity项目。
使用根包还允许组件扫描只应用到你的项目上。
如果你不想使用@SpringBootApplication这@EnableAutoConfiguration和@ComponentScan它导入的注释定义了这种行为,所以你也可以用这些注释代替。 |
以下列表展示了典型的布局:
com
+- example
+- myapplication
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
这MyApplication.java文件将声明主要方法,以及基本@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类。
通常是定义主要方法作为主要候选@Configuration.
许多使用 XML 配置的 Spring 配置示例已在互联网上发布。
如果可能,尽量使用等效的基于Java的配置。
寻找使*注释可以是一个很好的起点。 |
4. 自动配置
Spring Boot 自动配置会根据你添加的 jar 依赖自动配置你的 Spring 应用。
例如,如果HSQLDB在你的类路径上,且你没有手动配置任何数据库连接 beans,那么 Spring Boot 会自动配置内存中的数据库。
你需要通过添加@EnableAutoConfiguration或@SpringBootApplication注释到你的其中一个@Configuration类。
你应该只添加一个@SpringBootApplication或@EnableAutoConfiguration注解。
我们通常建议你在主修中加入其中一个@Configuration只有上课。 |
4.1. 逐步取代自动配置
自动配置是非侵入式的。
你可以随时开始定义自己的配置,以替换自动配置中的具体部分。
例如,如果你添加了自己的数据来源默认的嵌入式数据库支持Bean退缩了。
如果你需要了解当前应用了哪些自动配置以及原因,请先从以下方式开始你的应用程序--调试开关。
这样做可以为部分核心日志器创建调试日志,并将状态报告记录到控制台。
4.2. 禁用特定的自动配置类
如果你发现应用了你不想要的特定自动配置类,可以使用 的 exclude 属性@SpringBootApplication如下示例所示,使其失效:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {
}
@SpringBootApplication(exclude = [DataSourceAutoConfiguration::class])
class MyApplication
如果该类不在类路径上,你可以使用除外姓名并指定了全限定的名称。
如果你更喜欢使用@EnableAutoConfiguration而不是@SpringBootApplication,排除和除外姓名也都有。
最后,你还可以通过使用Spring.autoconfigure.exclude财产。
| 你可以在注释层面定义排除,也可以使用属性来定义。 |
尽管自动配置类是公共,类中唯一被视为公开API的方面是类的名称,可用于禁用自动配置。
这些类的实际内容,如嵌套配置类或 bean 方法,仅供内部使用,我们不建议直接使用。 |
5. 春季豆与依赖注射
你可以自由使用任何标准的 Spring Framework 技术来定义你的豆子及其注入依赖。
我们通常建议使用构造器注入来连接依赖关系,@ComponentScan去找豆子。
如果你按照上面建议的结构化代码(把应用类放在顶部包里),你可以添加@ComponentScan无需任何论元或使用@SpringBootApplication注释中隐含了它。
你所有的应用组件(@Component,@Service,@Repository,@Controller以及其他)自动注册为春豆。
以下示例展示了一个@Service使用构造子注入获得所需风险评估员豆:
@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
如果一个豆子有多个构造体,你需要标记你想让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
}
// ...
}
注意使用构造子注入可以风险评估员字段标记为最后,表示此后无法更改。 |
6. 使用@SpringBootApplication注释
许多 Spring Boot 开发者喜欢他们的应用使用自动配置、组件扫描,并且能够在“应用类”上定义额外的配置。
一首单曲@SpringBootApplication注释可用于启用这三个功能,即:
-
@EnableAutoConfiguration启用 Spring Boot 的自动配置机制 -
@ComponentScan:使@Component扫描应用所在的包裹(参见最佳实践)) -
@SpringBootConfiguration:在上下文中启用额外豆子的注册或导入额外的配置类。 斯普林标准的替代方案@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
Kotlin
在这个例子中, |
7. 运行您的应用程序
将应用打包为jar并使用嵌入式HTTP服务器的最大优势之一是,你可以像运行其他应用一样运行。 示例适用于调试 Spring Boot 应用程序。 你不需要任何特殊的IDE插件或扩展。
| 本节仅涵盖罐装包装。 如果你选择将应用打包为战争文件,请查看服务器和IDE文档。 |
7.1. 从集成开发环境(IDE)运行
你可以从IDE运行Spring Boot应用,作为Java应用。
不过,你首先需要导入你的项目。
导入步骤会根据你的IDE和构建系统而有所不同。
大多数IDE可以直接导入Maven项目。
例如,Eclipse 用户可以选择进口。。。→现有的Maven项目来自文件菜单。
如果你不小心运行了两次网页应用,你会看到“端口已在使用中”的错误。
Spring Tools 用户可以使用重启按钮而非执行按钮以确保任何现有实例都已关闭。 |
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 插件包含一个执行目标可以快速编译和运行你的应用程序。
应用程序以爆炸形式运行,就像在你的IDE中一样。
以下示例展示了运行 Spring Boot 应用程序的典型 Maven 命令:
$ mvn spring-boot:run
你也可以用MAVEN_OPTS作系统环境变量,如下示例所示:
$ export MAVEN_OPTS=-Xmx1024m
8. 开发者工具
Spring Boot 包含了一套额外的工具,可以让应用开发体验更加愉快。
这Spring-boot-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")
}
| 开发工具可能会引发类加载问题,尤其是在多模块项目中。《诊断类加载问题》解释了如何诊断和解决这些问题。 |
当运行完整打包的应用程序时,开发者工具会自动被禁用。如果你的应用程序从Java -jar或者如果它是从特殊的类加载器启动的,则被视为“生产应用程序”。你可以通过使用spring.devtools.restart.enabled系统属性。要启用开发工具,无论用哪个类加载器启动你的应用程序,都设置-Dspring.devtools.restart.enabled=true系统属性。在运行开发工具存在安全风险的生产环境中,绝不能这样做。要禁用开发工具,排除依赖或设置-Dspring.devtools.restart.enabled=false系统属性。 |
在 Maven 中将依赖标记为可选,或者使用仅开发Gradle 中的配置(如上所示)防止开发工具被传递应用到使用你项目的其他模块。 |
重新打包的压缩包默认不包含开发工具。如果你想使用某个远程开发工具功能,就必须包含它。使用 Maven 插件时,设置exclusionDevtools属性到false. 使用Gradle插件时,配置任务的类路径以包含仅开发配置. |
8.1. 分类加载问题的诊断
如Restart与Reload部分所述,重启功能通过使用两个类加载器实现。对于大多数应用,这种方法效果良好。然而,有时会导致类加载问题,尤其是在多模块项目中。
要诊断 classloading 问题是否真的是由 devtools 及其两个 classloader 引起的,可以尝试禁用 restart。如果这样解决了你的问题,可以自定义 restart classloader 以包含整个项目。
8.2. 财产违约
Spring Boot 支持的几个库使用缓存来提升性能。例如,模板引擎缓存已编译的模板以避免反复解析模板文件。此外,Spring MVC 可以在提供静态资源时为响应添加 HTTP 缓存头部。
虽然缓存在生产环境中非常有益,但在开发过程中可能会适得其反,导致你无法看到刚刚做的应用程序更改。因此,spring-boot-devtools 默认禁用缓存选项。
缓存选项通常通过你的设置来配置application.properties文件。 例如,Thymeleaf提供Spring.百里香叶.缓存财产。 与其手动设置这些属性,不如Spring-boot-devtools模块会自动应用合理的开发时间配置。
下表列出了所有应用的属性:
| 名称 | 默认值 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果你不想应用属性默认值,可以设置spring.devtools.add-properties(Spring自false在你的application.properties. |
由于在开发 Spring MVC 和 Spring WebFlux 应用时需要更多关于网页请求的信息,开发者工具建议你启用调试为Web日志组。这将为你提供关于接收请求的信息、处理请求的处理器、响应结果以及其他细节。如果你想记录所有请求细节(包括潜在敏感信息),你可以开启spring.mvc.log-请求-详情或spring.codec.log-请求-详情配置属性。
8.3. 自动重启
使用Spring-boot-devtools每当类路径上的文件发生变化时,会自动重启。
这在 IDE 工作时非常有用,因为它为代码变更提供了非常快速的反馈循环。
默认情况下,类路径中指向目录的任何条目都会被监控。
请注意,某些资源,如静态资产和视图模板,无需重启应用程序。
如果你用 Maven 或 Gradle 的构建插件重启,必须保留分 叉设置为启用.
如果你禁用分叉,开发工具中使用的隔离应用类加载器将不会被创建,重启也无法正常工作。 |
| 自动重启配合LiveReload效果非常好。详情请参见LiveReload部分。 如果你用JRebel,自动重启会被禁用,取而代之的是动态类重新加载。 其他开发工具功能(如LiveReload和属性覆盖)仍然可以使用。 |
DevTools 依赖应用上下文的关机钩子在重启时关闭该接口。
如果你禁用了关机钩,它就无法正常工作了 (SpringApplication.setRegisterShutdownHook(false)). |
开发工具需要定制ResourceLoader被以下机构使用应用上下文.
如果你的申请已经提供了,那它就会被包装。
直接覆盖获取资源方法应用上下文不支持。 |
| 使用 AspectJ 织入时不支持自动重启。 |
8.3.1. 状态评估中的记录变化
默认情况下,每次应用重启时,都会记录显示状态评估差异的报告。 报告显示了你在添加或移除豆子和设置配置属性等更改时,应用程序自动配置的变化。
要禁用报告的日志,请设置以下属性:
spring.devtools.restart.log-condition-evaluation-delta=false
spring:
devtools:
restart:
log-condition-evaluation-delta: false
8.3.2. 排除资源
某些资源在更改时不一定需要触发重启。
例如,Thymeleaf 模板可以在原地编辑。
默认情况下,在 中更改资源/元步兵/专家,/元补强/资源,/资源,/静态的,/公共或/模板不会触发重启,但会触发一次实时装填。
如果你想自定义这些排除项,可以使用Spring.devtools.restart.exclude财产。
例如,只排除/静态的和/公共你将设置以下属性:
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 系统属性到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属性是触发文件的名称(不包括任何路径)。
触发文件必须出现在你的类路径上某个位置。
例如,如果你有一个结构如下的项目:
src
+- main
+- resources
+- .reloadtrigger
然后你触发文件属性为:
spring.devtools.restart.trigger-file=.reloadtrigger
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
现在只有在src/main/resources/.reloadtrigger已更新。
你可能想设置一下spring.devtools.restart.trigger-file作为一个全局设置,这样你所有的项目都能以相同方式表现。 |
有些IDE有功能,可以省去手动更新触发文件。Eclipse 的 Spring Tools 和 IntelliJ IDEA(终极版)都有这样的支持。
用Spring Tools,你可以在控制台视图里按“重新加载”按钮(只要你触发文件被命名为.reloadtrigger).
对于IntelliJ IDEA,你可以按照他们文档中的说明作。
8.3.6. 自定义重启 Classloader
如前述“重启与重载”部分所述,重启功能通过使用两个类加载器实现。 如果这导致问题,你可能需要自定义哪个 classloader 加载的内容。
默认情况下,IDE中任何打开的项目都会加载“重启”类加载器,以及任何普通项目。罐文件被加载为“基础”类加载程序。
如果你用MVN Spring-boot:run或gradle bootRun:包含你的项目@SpringBootApplication加载了“重启”类加载器,其他所有内容都装载了“基础”类加载器。
你可以通过创建一个META-INF/spring-devtools.properties文件。
这Spring-devtools.properties文件可以包含前缀为restart.exclude和restart.include.
这包括元素是应当被拉入“重启”类加载器的项目,并且排除元素是应推入“基础”类加载器的项目。
该性质的值是一个正则表达式模式,应用于类路径,如下例所示:
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。或restart.exclude。这是考虑的。 |
都META-INF/spring-devtools.properties从类路径加载。
你可以在项目内部打包文件,或者在项目使用的库中打包文件。 |
8.4. LiveReload
这Spring-boot-devtools模块包含一个嵌入式的LiveReload服务器,可用于在资源变更时触发浏览器刷新。
LiveReload浏览器扩展免费适用于Chrome、Firefox和Safari。
你可以通过在你选择的浏览器的市场或商店搜索“LiveReload”来找到这些扩展。
如果你不想在应用运行时启动LiveReload服务器,可以设置spring.devtools.livereload.enabled属性到false.
| 你一次只能运行一个LiveReload服务器。 启动应用前,确保没有其他LiveReload服务器在运行。 如果你从 IDE 启动多个应用程序,只有第一个支持LiveReload。 |
| 要在文件发生变化时触发LiveReload,必须启用自动重启。 |
8.5. 全局设置
你可以通过添加以下任一文件来配置全局开发者工具的设置$HOME/.config/spring-boot目录:
-
Spring-boot-DevTools.properties -
Spring-boot-DevTools.yaml -
spring-boot-devtools.yml
添加到这些文件上的任何属性都适用于你机器上所有使用 devtools 的 Spring Boot 应用程序。
例如,要配置restart始终使用触发文件,你可以在你的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文件。
这允许你与使用旧版 Spring Boot 但不支持$HOME/.config/spring-boot位置。 |
|
开发工具的属性/yaml文件不支持配置文件。 任何激活的配置文件 |
8.5.1. 配置文件系统观察者
FileSystemWatcher 的工作原理是轮询在特定时间区间内的类变更,然后等待预设的安静期以确保没有更多变更。
由于 Spring Boot 完全依赖 IDE 编译并复制文件到其读取位置,你可能会发现某些更改在 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的远程支持。 你绝不应该在生产部署时启用支持。
要启用它,你需要确保开发工具包含在重新包装的档案中,如下列表所示:
<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财产。
像任何重要的密码或秘密一样,数值应当独特且强大,无法被猜测或暴力破解。
远程开发工具支持分为两部分:一个是接受连接的服务器端端点,另一个是你在 IDE 中运行的客户端应用。
当Spring.DevTools.Remote.secret属性被设置。
客户端组件必须手动启动。
| Spring WebFlux 应用程序不支持 Remote DevTools。 |
8.6.1. 运行远程客户端应用程序
远程客户端应用设计为在你的IDE内部运行。
你得跑org.springframework.boot.devtools.RemoteSpringApplication使用与你连接的远程项目相同的类路径。
应用程序唯一需要的参数是它连接的远程 URL。
例如,如果你使用 Eclipse 或 Spring Tools,并且有一个名为我的应用如果你已经部署到 Cloud Foundry,你需要做以下作:
-
选择
运行配置......来自执行菜单。 -
创建一个新的
Java 应用“发射配置”。 -
浏览
我的应用项目。 -
用
org.springframework.boot.devtools.RemoteSpringApplication作为主职业。 -
加
https://myapp.cfapps.io前往程序参数(或者你远程网址是什么)。
一个运行中的远程客户端可能如下列表:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \ \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / / =========|_|==============|___/===================================/_/_/_/ :: Spring Boot Remote :: (v2.7.18) 2023-11-23 07:23:21.930 INFO 28462 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication v2.7.18 using Java 1.8.0_392 on myhost with PID 28462 (/Users/myuser/.m2/repository/org/springframework/boot/spring-boot-devtools/2.7.18/spring-boot-devtools-2.7.18.jar started by myuser in /opt/apps/) 2023-11-23 07:23:21.936 INFO 28462 --- [ main] o.s.b.devtools.RemoteSpringApplication : No active profile set, falling back to 1 default profile: "default" 2023-11-23 07:23:22.314 INFO 28462 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 2023-11-23 07:23:22.338 INFO 28462 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.858 seconds (JVM running for 1.35)
由于远程客户端使用与真实应用相同的类路径,它可以直接读取应用属性。
这是Spring.DevTools.Remote.secret属性被读取并传递给服务器进行认证。 |
建议始终使用这些https://作为连接协议,使流量被加密且密码无法被拦截。 |
如果你需要使用代理访问远程应用,可以配置Spring.devtools.remote.proxy.host和Spring.devtools.remote.proxy.port性能。 |
8.6.2. 远程更新
远程客户端会像本地重启一样监控你的应用类路径变化。 任何更新的资源都会被推送到远程应用程序,并且(如有需要)会触发重启。 如果你在本地没有云服务的功能上迭代,这会很有帮助。 通常,远程更新和重启比完整的重建和部署周期要快得多。
在较慢的开发环境中,安静期可能不够,班级变更可能会被拆分成批次。 服务器在第一批职业更改上传后重启。 下一批文件无法发送给应用程序,因为服务器正在重启。
这通常通过警告表现为远程春应用记录了未能上传部分课程,以及随后的重试。
但这也可能导致应用代码不一致,以及在第一批更改上传后无法重启。
如果你经常遇到这样的问题,试着提高spring.devtools.restart.poll-interval和spring.devtools.restart.quiet-period参数以适应你的开发环境。
有关配置这些属性,请参见“配置文件系统观察者”部分。
| 文件只有在远程客户端运行时才会被监控。 如果你在启动远程客户端前更改文件,它不会被推送到远程服务器。 |
9. 打包您的应用程序以供生产
可执行 jar 可用于生产部署。 由于它们是自给自足的,也非常适合云端部署。
对于额外的“生产准备”功能,如健康、审计以及度量 REST 或 JMX 端点,可以考虑添加Spring-启动-执行器.
详情请参见actuator.html。
10. 接下来要读什么
你现在应该了解如何使用 Spring Boot 以及一些应遵循的最佳实践。 你现在可以深入学习 Spring Boot 的具体功能,或者直接跳过阅读 Spring Boot 的“生产准备”方面。