首页 > 其他分享 >使用 Spring Boot 进行开发

使用 Spring Boot 进行开发

时间:2022-11-09 17:35:29浏览次数:40  
标签:Spring 使用 boot 应用程序 开发 Boot spring starter

本节更详细地介绍了如何使用 Spring Boot。它涵盖了诸如构建系统、自动配置以及如何运行应用程序等主题。我们还介绍了一些 Spring Boot 最佳实践。尽管 Spring Boot 没有什么特别之处(它只是您可以使用的另一个库),但有一些建议可以让您的开发过程更轻松一些。

使用 Spring Boot 进行开发_spring

如果您刚开始使用 Spring Boot,您可能应该在深入了解本节之前阅读​入门指南。​

1. 构建系统

强烈建议您选择支持依赖管理并且可以使用发布到“Maven Central”存储库的工件的构建系统。我们建议您选择 Maven 或 Gradle。可以让 Spring Boot 与其他构建系统(例如 Ant)一起工作,但它们并没有得到特别好的支持。

1.1.依赖管理

Spring Boot 的每个版本都提供了它支持的依赖项的精选列表。实际上,您不需要在构建配置中为任何这些依赖项提供版本,因为 Spring Boot 会为您管理。当您升级 Spring Boot 本身时,这些依赖项也会以一致的方式升级。

精选列表包含您可以与 Spring Boot 一起使用的所有 Spring 模块以及第三方库的精致列表。该列表以标准材料清单 ( ​​spring-boot-dependencies​​) 的形式提供,可与Maven和Gradle一起使用。

1.2. 马文

要了解如何将 Spring Boot 与 Maven 结合使用,请参阅 Spring Boot 的 Maven 插件的文档:

  • 参考(HTML和PDF)
  • API

1.3. 摇篮

要了解如何将 Spring Boot 与 Gradle 一起使用,请参阅 Spring Boot 的 Gradle 插件的文档:

  • 参考(HTML和PDF)
  • API

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.5" />

<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>

1.5.开胃菜

Starters 是一组方便的依赖描述符,您可以将其包含在您的应用程序中。您可以获得所需的所有 Spring 和相关技术的一站式商店,而无需搜索示例代码和复制粘贴加载的依赖描述符。例如,如果您想开始使用 Spring 和 JPA 进行数据库访问,请将​​spring-boot-starter-data-jpa​​依赖项包含在您的项目中。

启动器包含许多依赖项,您需要这些依赖项使项目快速启动并运行,并具有一致的、受支持的托管传递依赖项集。

名字里有什么

所有官方启动器都遵循类似的命名模式;​​spring-boot-starter-*​​,其中​​*​​是特定类型的应用程序。此命名结构旨在帮助您在需要查找启动器时提供帮助。许多 IDE 中的 Maven 集成允许您按名称搜索依赖项。例如,安装了适当的 Eclipse 或 Spring Tools 插件后,您可以​​ctrl-space​​在 POM 编辑器中按下并键入“spring-boot-starter”以获取完整列表。

正如“创建您自己的 Starter ”部分所述,第三方 starter 不应以 开头​​spring-boot​​,因为它是为官方 Spring Boot 工件保留的。相反,第三方启动器通常以项目名称开头。例如,一个名为的第三方启动项目​​thirdpartyproject​​通常被命名为​​thirdpartyproject-spring-boot-starter​​.

以下应用程序启动器由该​​org.springframework.boot​​组下的 Spring Boot 提供:

表 1. Spring Boot 应用程序启动器

姓名

描述

​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 的缓存支持的 Starter

​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-r2dbc​

使用 Spring Data R2DBC 的入门者

​spring-boot-starter-data-redis​

将 Redis 键值数据存储与 Spring Data Redis 和 Lettuce 客户端一起使用的入门

​spring-boot-starter-data-redis-reactive​

使用带有 Spring Data Redis 反应式和 Lettuce 客户端的 Redis 键值数据存储的启动器

​spring-boot-starter-data-rest​

使用 Spring Data REST 通过 REST 公开 Spring Data 存储库的启动器

​spring-boot-starter-freemarker​

使用 FreeMarker 视图构建 MVC Web 应用程序的 Starter

​spring-boot-starter-graphql​

使用 Spring GraphQL 构建 GraphQL 应用程序的 Starter

​spring-boot-starter-groovy-templates​

使用 Groovy 模板视图构建 MVC Web 应用程序的 Starter

​spring-boot-starter-hateoas​

使用 Spring MVC 和 Spring HATEOAS 构建基于超媒体的 RESTful Web 应用程序的启动器

​spring-boot-starter-integration​

使用 Spring Integration 的入门者

​spring-boot-starter-jdbc​

使用 JDBC 和 HikariCP 连接池的 Starter

​spring-boot-starter-jersey​

使用 JAX-RS 和 Jersey 构建 RESTful Web 应用程序的初学者。一个替代方案spring-boot-starter-web

​spring-boot-starter-jooq​

使用 jOOQ 通过 JDBC 访问 SQL 数据库的入门程序。替代spring-boot-starter-data-jpa​或spring-boot-starter-jdbc

​spring-boot-starter-json​

读写json的starter

​spring-boot-starter-jta-atomikos​

使用 Atomikos 进行 JTA 事务的启动器

​spring-boot-starter-mail​

使用 Java Mail 和 Spring Framework 的电子邮件发送支持的 Starter

​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 调度器的启动器

​spring-boot-starter-rsocket​

用于构建 RSocket 客户端和服务器的启动器

​spring-boot-starter-security​

使用 Spring Security 的入门者

​spring-boot-starter-test​

使用包括 JUnit Jupiter、Hamcrest 和 Mockito 在内的库来测试 Spring Boot 应用程序的 Starter

​spring-boot-starter-thymeleaf​

使用 Thymeleaf 视图构建 MVC Web 应用程序的启动器

​spring-boot-starter-validation​

使用带有 Hibernate Validator 的 Java Bean Validation 的 Starter

​spring-boot-starter-web​

使用 Spring MVC 构建 Web 应用程序的入门程序,包括 RESTful 应用程序。使用 Tomcat 作为默认的嵌入式容器

​spring-boot-starter-web-services​

使用 Spring Web 服务的入门者

​spring-boot-starter-webflux​

使用 Spring Framework 的响应式 Web 支持构建 WebFlux 应用程序的启动器

​spring-boot-starter-websocket​

使用 Spring Framework 的 WebSocket 支持构建 WebSocket 应用程序的 Starter

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

表 2. Spring Boot 生产启动器

姓名

描述

​spring-boot-starter-actuator​

使用 Spring Boot 的 Actuator 的 Starter,它提供了生产就绪的特性来帮助你监控和管理你的应用程序

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

表 3. Spring Boot 技术入门

姓名

描述

​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 容器的启动器。使用的默认 servlet 容器启动器spring-boot-starter-web

​spring-boot-starter-undertow​

使用 Undertow 作为嵌入式 servlet 容器的启动器。一个替代方案spring-boot-starter-tomcat

要了解如何交换技术方面,请参阅交换 Web 服务器和日志系统的操作指南文档。

2. 构建你的代码

Spring Boot 不需要任何特定的代码布局即可工作。但是,有一些最佳实践会有所帮助。

2.1.使用“默认”包

当一个类不包含​​package​​​声明时,它被认为在“默认包”中。通常不鼓励使用“默认包”,应避免使用。它可能会导致使用​​@ComponentScan​​​、​​@ConfigurationPropertiesScan​​​、​​@EntityScan​​​或​​@SpringBootApplication​​注释的 Spring Boot 应用程序出现特殊问题,因为每个 jar 中的每个类都被读取。

2.2. 定位主应用程序类

我们通常建议您将主应用程序类定位在其他类之上的根包中。@SpringBootApplication注释通常放置在您的主类上,它隐含地为某些项目定义了一个基本的“搜索包” 。例如,如果您正在编写 JPA 应用程序,则使用带​​@SpringBootApplication​​注释的类的包来搜索​​@Entity​​项目。使用根包还允许组件扫描仅应用于您的项目。

下面的清单显示了一个典型的布局:

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);
}

}

3. 配置类

Spring Boot 支持基于 Java 的配置。尽管可以​​SpringApplication​​​与 XML 源一起使用,但我们通常建议您的主要源是单个​​@Configuration​​​类。通常,定义该​​main​​​方法的类是主要的候选者​​@Configuration​​。

3.1导入其他配置类

你不需要把你所有的东西都​​@Configuration​​放在一个班级里。注解可​​@Import​​用于导入其他配置类。或者,您可以使用​​@ComponentScan​​自动获取所有 Spring 组件,包括​​@Configuration​​类。

3.2. 导入 XML 配置

如果您绝对必须使用基于 XML 的配置,我们建议您仍然从​​@Configuration​​类开始。然后,您可以使用​​@ImportResource​​注释来加载 XML 配置文件。

4. 自动配置

Spring Boot 自动配置尝试根据您添加的 jar 依赖项自动配置您的 Spring 应用程序。例如,如果​​HSQLDB​​在你的类路径上,并且你没有手动配置任何数据库连接 bean,那么 Spring Boot 会自动配置一个内存数据库。

​@EnableAutoConfiguration​​​您需要通过向其中一个类添加或​​@SpringBootApplication​​​注释来选择自动配置​​@Configuration​​。

4.1.逐步取代自动配置

自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置来替换自动配置的特定部分。例如,如果您添加自己的​​DataSource​​bean,则默认的嵌入式数据库支持会退出。

如果您需要了解当前正在应用哪些自动配置以及原因,请使用​​--debug​​开关启动您的应用程序。这样做可以为选择的核心记录器启用调试日志,并将条件报告记录到控制台。

4.2. 禁用特定的自动配置类

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

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class MyApplication {

}

如果类不在类路径上,您可以使用​​excludeName​​​注解的属性并指定完全限定名称。如果您更喜欢使用​​@EnableAutoConfiguration​​​而不是​​@SpringBootApplication​​​,​​exclude​​​并且​​excludeName​​​也可用。最后,您还可以使用该​​spring.autoconfigure.exclude​​属性控制要排除的自动配置类的列表。

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;
}

// ...

}

如果一个 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;
}

// ...

}

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);
}

}

7. 运行你的应用程序

将应用程序打包为 jar 并使用嵌入式 HTTP 服务器的最大优势之一是您可以像运行其他应用程序一样运行应用程序。该示例适用于调试 Spring Boot 应用程序。您不需要任何特殊的 IDE 插件或扩展。

7.1.从 IDE 运行

您可以从 IDE 将 Spring Boot 应用程序作为 Java 应用程序运行。但是,您首先需要导入您的项目。导入步骤因您的 IDE 和构建系统而异。大多数 IDE 可以直接导入 Maven 项目。例如,Eclipse 用户可以从菜单中选择​​Import…​​→ 。​​Existing Maven Projects​​​​File​

如果您无法直接将项目导入 IDE,则可以使用构建插件生成 IDE 元数据。Maven 包括Eclipse和IDEA的插件。Gradle 为各种 IDE提供插件。

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

7.4. 使用 Gradle 插件

Spring Boot Gradle 插件还包括一个​​bootRun​​任务,可用于以分解的形式运行您的应用程序。​​bootRun​​每当您应用​​org.springframework.boot​​和插件时都会添加该任务​​java​​,如下例所示:

$ gradle 启动运行

您可能还想使用​​JAVA_OPTS​​操作系统环境变量,如以下示例所示:

$ 导出 JAVA_OPTS=-Xmx1024m

7.5热插拔

由于 Spring Boot 应用程序是普通的 Java 应用程序,因此 JVM 热交换应该开箱即用。JVM 热交换在某种程度上受限于它可以替换的字节码。对于更完整的解决方案,可以使用JRebel 。

该​​spring-boot-devtools​​模块还包括对快速应用程序重启的支持。有关详细信息,请参阅热插拔“操作方法”。

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")
}

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​​自动应用合理的开发时配置。

下表列出了所有应用的属性:

姓名

默认值

​server.error.include-binding-errors​

​always​

​server.error.include-message​

​always​

​server.error.include-stacktrace​

​always​

​server.servlet.jsp.init-parameters.development​

​true​

​server.servlet.session.persistent​

​true​

​spring.freemarker.cache​

​false​

​spring.graphql.graphiql.enabled​

​true​

​spring.groovy.template.cache​

​false​

​spring.h2.console.enabled​

​true​

​spring.mustache.servlet.cache​

​false​

​spring.mvc.log-resolved-exception​

​true​

​spring.reactor.debug​

​true​

​spring.template.provider.cache​

​false​

​spring.thymeleaf.cache​

​false​

​spring.web.resources.cache.period​

​0​

​spring.web.resources.chain.cache​

​false​

因为您在开发 Spring MVC 和 Spring WebFlux 应用程序时需要有关 Web 请求的更多信息,所以开发人员工具建议您为日志记录组启用​​DEBUG​​​日志记录。​​web​​​这将为您提供有关传入请求、正在处理它的处理程序、响应结果和其他详细信息的信息。如果您希望记录所有请求详细信息(包括潜在的敏感信息),您可以打开​​spring.mvc.log-request-details​​​或​​spring.codec.log-request-details​​配置属性。

8.3. 自动重启

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

触发重启

由于 DevTools 监控类路径资源,触发重启的唯一方法是更新类路径。无论您使用的是 IDE 还是其中一个构建插件,都必须重新编译修改后的文件以触发重新启动。更新类路径的方式取决于您使用的工具:

  • 在 Eclipse 中,保存修改后的文件会导致类路径更新并触发重新启动。
  • 在 IntelliJ IDEA 中,构建项目 ( Build +→+ Build Project) 具有相同的效果。
  • 如果使用构建插件,​​mvn compile​​为 Maven 或​​gradle build​​Gradle 运行将触发重新启动。

8.3.1. 在条件评估中记录变化

默认情况下,每次您的应用程序重新启动时,都会记录显示条件评估增量的报告。该报告显示在您进行更改(例如添加或删除 bean 和设置配置属性)时对应用程序自动配置的更改。

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

特性

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/**

8.3.3. 观看其他路径

当您对不在类路径上的文件进行更改时,您可能希望重新启动或重新加载您的应用程序。为此,请使用该​​spring.devtools.restart.additional-paths​​属性配置其他路径以监视更改。您可以使用前面描述​​spring.devtools.restart.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);
}

}

8.3.5使用触发文件

如果您使用持续编译更改文件的 IDE,您可能更愿意仅在特定时间触发重新启动。为此,您可以使用“触发文件”,这是一个特殊文件,当您想要实际触发重新启动检查时必须对其进行修改。

要使用触发器文件,请将​​spring.devtools.restart.trigger-file​​属性设置为触发器文件的名称(不包括任何路径)。触发器文件必须出现在您的类路径中的某处。

例如,如果您有一个具有以下结构的项目:

源代码
+- 主要
+- 资源
+- .reloadtrigger

那么您的​​trigger-file​​财产将是:

特性

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

现在仅在​​src/main/resources/.reloadtrigger​​更新时才会重新启动。

某些 IDE 具有使您无需手动更新触发器文件的功能。 Spring Tools for Eclipse​和IntelliJ IDEA(终极版)​都有这样的支持。使用 Spring Tools,您可以使用控制台视图中的“重新加载”按钮(只要您​​trigger-file​​​的名称为​​.reloadtrigger​​​)。对于 IntelliJ IDEA,您可以按照其文档中的说明进行操作。

8.3.6. 自定义重启类加载器

正如前面在Restart vs Reload部分中所描述的,重启功能是通过使用两个类加载器来实现的。如果这会导致问题,您可能需要自定义由哪个类加载器加载的内容。

默认情况下,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

8.3.7. 已知限制

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

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

8.4. 实时重载

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

如果您不想在应用程序运行时启动 LiveReload 服务器,您可以将该​​spring.devtools.livereload.enabled​​属性设置为​​false​​.

8.5全局设置

您可以通过将以下任何文件添加到​​$HOME/.config/spring-boot​​目录来配置全局 devtools 设置:

  1. ​spring-boot-devtools.properties​
  2. ​spring-boot-devtools.yaml​
  3. ​spring-boot-devtools.yml​

添加到这些文件的任何属性都适用于您机器上使用 devtools 的所有Spring Boot 应用程序。例如,要将重新启动配置为始终使用触发器文件,您可以将以下属性添加到​​spring-boot-devtools​​文件中:

特性

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

默认情况下,​​$HOME​​​是用户的主目录。要自定义此位置,请设置​​SPRING_DEVTOOLS_HOME​​​环境变量或​​spring.devtools.home​​系统属性。

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

现在每 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​​设置属性时,服务器组件会自动启用。客户端组件必须手动启动。

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.ioProgram arguments(或任何您的远程 URL)。

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

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|===============|___/===================== ===============/_/_/_/
:: Spring Boot 远程 :: (v2.7.5)

2022-10-20 12:40:15.175 INFO 16215 --- [main] osbdevtools.RemoteSpringApplication:在 PID 16215 的 myhost 上使用 Java 1.8.0_345 启动 RemoteSpringApplication v2.7.5 (/Users/myuser/.m2/repository/org/ springframework/boot/spring-boot-devtools/2.7.5/spring-boot-devtools-2.7.5.jar 由 myuser 在 /opt/apps/ 中启动
2022-10-20 12:40:15.182 INFO 16215 --- [main] osbdevtools.RemoteSpringApplication:未设置活动配置文件,回退到 1 个默认配置文件:“默认”
2022-10-20 12:40:15.913 INFO 16215 --- [main] osbdaOptionalLiveReloadServer:LiveReload 服务器正在端口 35729 上运行
2022-10-20 12:40:15.946 INFO 16215 --- [main] osbdevtools.RemoteSpringApplication:在 1.471 秒内启动 RemoteSpringApplication(JVM 运行 2.063)

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 的“生产就绪”方面的内容。

标签:Spring,使用,boot,应用程序,开发,Boot,spring,starter
From: https://blog.51cto.com/u_15326439/5837391

相关文章

  • 软件开发中的真理
    1.强耦合可破万法别管什么消息机制、信号槽机制、观察者模式...实在不知道怎么让两个类交互就用强耦合、想操作什么对象就存一个它的指针或者引用、然后调用相应的方......
  • springboot+vue前后端分离国际化
    一,概要前端使用vue-i18n框架来实现国际化功能,国际化数据存储在数据库里,由后端接口提供,使用pinia缓存。后端使用redis缓存,并使用拦截器对响应中的提示信息做国际化。二......
  • Spring Boot 引起的 “堆外内存泄漏”,太坑了,快看看你什么版本!
    作者:纪兵,2015年加入美团,目前主要从事酒店C端相关的工作。原文:https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak.html背景为了更好地实现对项目的管......
  • Spring Boot 入门
    如果您开始使用SpringBoot或一般的“Spring”,请从阅读本节开始。它回答了基本的“什么?”,“如何?” “为什么?” 问题。它包括对SpringBoot的介绍以及安装说明。然后,我......
  • H5游戏开发-TypeScript语言基础
    五、TypeScript语言基础1.认识TypeScriptTypeScript是一种由微软开发的开源的编程语言,它是js的一个超集,向js添加了静态类型和基于类的面向对象。2012年10月,微软发布了首......
  • #打卡不停更# OpenHarmony - 应用开发入门指南
    作者:余香鑫前言了解OpenHarmony能够开发一些简单的OpenHarmony应用一、了解OpenHarmonyOpenHarmony是由开放原子开源基金会(OpenAtomFoundation)孵化及运营的开源项......
  • 3.Eureka:Spring Cloud服务注册与发现组件(非常详细)
    Eureka一词来源于古希腊词汇,是“发现了”的意思。在软件领域,Eureka是Netflix公司开发的一款开源的服务注册与发现组件。SpringCloud将Eureka与Netflix中的其他开......
  • 大数据开发:Go中的方法
    我们知道Go中没有继承,接口的用法也与Java中的用法大相径庭,很多适合,我们需要使用OO的思想来组织我们达到项目,但是将Java的oo思想在Go中会比较痛苦,Go中的方法和面向对象的类......
  • PHP WebService接口开发
    生成wsdl文件,php不能生成入参对象的形式,用java生成比较简单。安装IntelliJIDEAsdk:1.8(不要使用高版本)打开项目下载soap.zip,IDEA打开项目。左侧项目列表,右键项目......
  • spring mvc @Configuration 无效问题
    spring版本:4.3.7addFormatters(FormatterRegistryregistry)不生效<!--此处与@EnableWebmvc冲突,配置此处后EnableWebmvc中的配置无效--><mvc:annotatio......