Spring Boot 2.2.2.RELEASE 版本中文参考文档【3.2 - 3.10】

Spring Boot 2.2.2.RELEASE版本中文文档持续更新中~如有需要获取参考文档文件,关注公众号JavaSo,回复“参考文档”即可。

3.2 结构化代码

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

3.2.1 使用“default”包

当一个类不包含引入包声明时,将其视为在默认包中。通常不建议使用默认包,应避免这种情况。对于使用@ ComponentScan,@ ConfigurationPropertiesScan,@ EntityScan或@SpringBootApplication注解的Spring Boot应用程序,这可能会导致特定的问题,因为每个jar中的每个类都会被读取。

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

3.2.2 放置应用程序主类

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

Tips: 如果您不想使用@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方法以及基本的@SpringBootApplication,如下所示:

 1 package com.example.myapplication;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 
 6 @SpringBootApplication
 7 public class Application {
 8 
 9     public static void main(String[] args) {
10         SpringApplication.run(Application.class, args);
11     }
12 
13 }

3.3 配置类

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

Tips: 在Internet上已经发布了许多使用XML配置的Spring配置示例。如果可能,请始终尝试使用等效的基于Java的配置。搜索 Enable* 注解可能是一个不错的起点。

3.3.1 导入其他配置类

您无需将所有@Configuration放在单个类中。@Import注解可用于导入其他配置类。另外,您可以使用@ComponentScan自动扫描所有Spring组件,包括@Configuration类。

3.3.2 导入XML配置

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

3.4 自动配置

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

您需要将@EnableAutoConfiguration或@SpringBootApplication注解其中之一添加到您的@Configuration类来选择加入自动配置。

Tips: 您应该只@SpringBootApplication或@EnableAutoConfiguration注解的其中一个。我们通常建议您仅将另一个添加到您的主要@Configuration类中。

3.4.1 逐渐取代自动配置

自动配置是非侵入性的。在任何时候,您都可以开始定义自己的配置,以替换自动配置的特定部分。例如,如果您添加自己的DataSource bean,则默认的嵌入式数据库会失效[ support backs away]。

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

3.4.2 禁用特定的自动配置类

如果发现不需要的特定自动配置类,则可以使用@EnableAutoConfiguration的exclude属性禁用它们,如以下示例所示:

1 import org.springframework.boot.autoconfigure.*;
2 import org.springframework.boot.autoconfigure.jdbc.*;
3 import org.springframework.context.annotation.*;
4 
5 @Configuration(proxyBeanMethods = false)
6 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
7 public class MyConfiguration {
8 }

如果该类不在类路径中,则可以使用注解的excludeName属性,并指定完全限定名称(com.example.project.ExampleConfiguration)。最后,您还可以使用spring.autoconfigure.exclude属性控制要排除的自动配置类的列表。

Tips: 在注解级别和使用属性均可以来定义排除项。

Note: 即使自动配置类是公共的,该类的唯一被认为是公共API的方面是可用于禁用自动配置的类的名称。这些类的实际内容(例如嵌套配置类或Bean方法)仅供内部使用,我们不建议直接使用它们。

Spring beans和依赖注入

您可以自由使用任何标准的Spring Framework技术来定义bean及其注入的依赖关系。为简单起见,我们发现使用@ComponentScan(组件扫描,查找您的bean)和使用@Autowired(进行构造函数注入)效果很好。

如果按照上面的建议构造代码(将应用程序主类放在根包中),则可以使用@ComponentScan而不添加任何参数。您的所有应用程序组件(@Component,@Service,@Repository,@Controller等)都将自动注册为Spring Bean。

以下示例显示了一个@Service Bean,它使用构造函数注入来获取所需的RiskAssessor Bean:

 1 package com.example.service;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Service;
 5 
 6 @Service
 7 public class DatabaseAccountService implements AccountService {
 8 
 9     private final RiskAssessor riskAssessor;
10 
11     @Autowired
12     public DatabaseAccountService(RiskAssessor riskAssessor) {
13         this.riskAssessor = riskAssessor;
14     }
15 
16     // ...
17 
18 }

如果bean具有一个构造函数,则可以省略@Autowired,如以下示例所示:

 1 @Service
 2 public class DatabaseAccountService implements AccountService {
 3 
 4     private final RiskAssessor riskAssessor;
 5 
 6     public DatabaseAccountService(RiskAssessor riskAssessor) {
 7         this.riskAssessor = riskAssessor;
 8     }
 9 
10     // ...
11 
12 }

Tips: 请注意,使用构造函数注入如何使riskAssessor字段被标记为final,指示其随后无法更改。

3.6 使用@SpringBootApplication注解

许多Spring Boot开发人员喜欢他们的应用程序使用自动配置、组件扫描,并能够在其“应用程序类”上定义额外的配置。单个@SpringBootApplication注解可用于启用这三个功能,即: @EnableAutoConfiguration:启用Spring Boot的自动配置机制 @ComponentScan:对应用程序所在的软件包启用@Component扫描(请参阅最佳实践)。 * @Configuration:允许在上下文中注册额外的bean或导入其他配置类。

 1 package com.example.myapplication;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 
 6 @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
 7 public class Application {
 8 
 9     public static void main(String[] args) {
10         SpringApplication.run(Application.class, args);
11     }
12 
13 }

Note: @SpringBootApplication还提供别名以自定义@EnableAutoConfiguration和@ComponentScan的属性。

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

 1 package com.example.myapplication;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.context.annotation.ComponentScan;
 5 import org.springframework.context.annotation.Configuration;
 6 import org.springframework.context.annotation.Import;
 7 
 8 @Configuration(proxyBeanMethods = false)
 9 @EnableAutoConfiguration
10 @Import({ MyConfig.class, MyAnotherConfig.class })
11 public class Application {
12 
13     public static void main(String[] args) {
14             SpringApplication.run(Application.class, args);
15     }
16 
17 }

在此示例中,除了没有自动检测到@Component注解的类和@ConfigurationProperties注解的类并且显式导入了用户定义的Bean外,Application就像其他任何Spring Boot应用程序一样(请参阅@Import)。

3.7 运行您的应用程序

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

Note: 本节仅介绍基于打包为jar的运行方式。如果选择将应用程序打包为war文件,则应参考服务器和IDE文档。

3.7.1 从IDE运行

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

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

Tips: 如果不小心两次运行Web应用程序,则会看到“端口已在使用中”错误。STS用户可以使用“重新启动”按钮而不是“运行”按钮来确保关闭任何现有实例。

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

3.7.3 使用Maven插件

Spring Boot Maven插件包含一个 run 目标,可用于快速编译和运行您的应用程序。应用程序可以像在IDE中一样运行。以下示例显示了运行Spring Boot应用程序的典型Maven命令:

 $ mvn spring-boot:run

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

$ export MAVEN_OPTS=-Xmx1024m

3.7.4 使用Gradle插件

Spring Boot Gradle插件还包含一个 bootRun 任务.每当您应用org.springframework.boot和Java插件时,都会添加bootRun任务,并在以下示例中显示:

$ gradle bootRun

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

$ export JAVA_OPTS=-Xmx1024m

3.7.5 热交换

由于Spring Boot应用程序只是普通的Java应用程序,因此可以立即使用JVM的热交换。JVM热插拔在一定程度上受到它可以替换的字节码的限制。对于更完整的解决方案,可以使用JRebel

spring-boot-devtools模块还包括对应用程序快速重启的支持。有关详细信息,请参见本章后面的“开发人员工具”部分和热插拔“操作方法”(此为热插拔操作方法的原文地址,翻译正在进行中)。

3.8 开发者工具

Spring Boot包含一组额外的工具,这些工具可以使应用程序开发体验更加愉快。spring-boot-devtools模块可以包含在任何项目中,以提供开发阶段额外的功能。要包括devtools支持,请将模块依赖项添加到您的构建中,如以下Maven清单所示:

Maven:

1 <dependencies>
2     <dependency>
3         <groupId>org.springframework.boot</groupId>
4         <artifactId>spring-boot-devtools</artifactId>
5         <optional>true</optional>
6     </dependency>
7 </dependencies>

Note: 运行完全打包的应用程序时,将自动禁用开发人员工具。如果您的应用程序是从java -jar启动的,或者是从特殊的类加载器启动的,则将其视为“生产环境应用程序”。如果这不适用于您(即,如果您从容器中运行应用程序),请考虑排除devtools或设置-Dspring.devtools.restart.enabled = false系统属性。

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

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

3.8.1 属性默认值

Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎(此为模板引擎的原文地址,翻译正在进行中)缓存已编译的模板,以避免重复解析模板文件。另外,Spring MVC可以在提供静态资源时向响应添加HTTP缓存头。

尽管缓存在生产中非常有益,但在开发过程中可能适得其反,从而使您无法看到刚刚在应用程序中所做的更改。因此,默认情况下,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。

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

3.8.2 自动重启

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

触发重启

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

Note: 只要启用了forking,您还可以使用受支持的构建插件(Maven和Gradle)启动应用程序,因为DevTools需要隔离的应用程序类加载器才能正常运行。默认情况下,Gradle和Maven插件会fork应用程序进程。

Tips: 与LiveReload一起使用时,自动重新启动效果很好。有关详细信息,请参见下文LiveReload部分。如果使用JRebel,则禁用自动重新启动,而支持动态类重新加载。其他devtools功能(例如LiveReload和属性替代)仍可以使用。

Tips: DevTools依赖于应用程序上下文的程序关闭钩子。如果您禁用了关闭钩子(SpringApplication.setRegisterShutdownHook(false)),它将无法正常工作。

Tips: 在确定类路径上的条目是否应在更改后触发重新启动时,DevTools会自动忽略名为spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter的项目。

Tips: DevTools需要自定义ApplicationContext使用的ResourceLoader。如果您的应用程序已经提供了,它将被包装。不支持在ApplicationContext上直接重写getResource方法。

重新启动与重新加载

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

如果发现重新启动对于您的应用程序来说不够快,或者遇到类加载问题,则可以考虑ZeroTurnaround重新加载技术,例如JRebel。这些方法通过在加载类时重写类来使其更易于重新加载。

记录条件评估中的更改[Logging changes in condition evaluation]

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

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

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

资源排除

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

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

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

观察其他路径

当您对不在类路径上的文件进行更改时,您可能希望重新启动或重新加载应用程序。为此,请使用 spring.devtools.restart.additional-paths 属性配置其他路径以监视更改。您可以使用前面所述的 spring.devtools.restart.exclude 属性来控制其他路径下的更改是触发完全重启还是实时重新加载。

禁用重启

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

如果您需要完全禁用重启支持(例如,因为它不适用于特定的库),则需要在调用SpringApplication.run(...)之前将spring.devtools.restart.enabled系统属性设置为false。如以下示例所示:

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

使用触发文件

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

Note: 对文件的任何更新都将触发检查,但是只有在Devtools检测到有事情要做的情况下,重启才真正发生。

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

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

src
+- main
   +- resources
      +- .reloadtrigger

然后,您的触发文件属性将是:

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

现在仅在src/main/resources/.reloadtrigger发生更改时才重启。

Tips: 您可能需要将spring.devtools.restart.trigger-file设置为全局设置(后文),以便所有项目的行为均相同。

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

自定义重启类加载器

如前面的“重新启动与重新加载”部分所述,重新启动功能是通过使用两个类加载器实现的。对于大多数应用程序,此方法效果很好。但是,有时可能会导致类加载问题。

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

spring-devtools.properties文件可以包含带有restart.exclude和restart.include前缀的属性。include元素是应上拉到“restart”类加载器中的项目,而exclude元素是应下推到“base”类加载器中的项目。该属性的值是应用于类路径的正则表达式模式,如以下示例所示:

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

Tips: 所有属性键都必须是唯一的。只要属性以restart.include. 或restart.exclude. 开头。

Note: 将加载类路径中的所有 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支持。

3.8.4 全局设置

您可以通过将以下任何文件添加到 $HOME/.config/spring-boot 文件夹来配置全局devtools设置: 1. spring-boot-devtools.properties 2. spring-boot-devtools.yaml 3. spring-boot-devtools.yml

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

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

如果在 $HOME/.config/spring-boot 中找不到devtools配置文件,则在 $HOME文件夹的根目录中搜索是否存在.spring-boot-devtools.properties文件。这使您可以与不支持 $HOME /.config/spring-boot位置的较旧版本的Spring Boot上的应用程序共享devtools全局配置。

在上述文件中激活的配置文件不会影响特定于配置文件的配置文件的加载。

3.8.5 远程应用

Spring Boot开发人员工具不仅限于本地开发 远程运行应用程序时,您还可以使用多种功能。选择启用远程支持,因为启用它可能会带来安全风险。仅当在受信任的网络上运行或使用SSL保护时,才应启用它。如果这两个选项都不可用,则不应使用DevTools的远程支持。您永远不要在生产部署上启用支持。

要启用它,您需要确保在包中包含devtools,如以下清单所示:

 1 <build>
 2     <plugins>
 3         <plugin>
 4             <groupId>org.springframework.boot</groupId>
 5             <artifactId>spring-boot-maven-plugin</artifactId>
 6             <configuration>
 7                 <excludeDevtools>false</excludeDevtools>
 8             </configuration>
 9         </plugin>
10     </plugins>
11 </build>

然后,您需要设置spring.devtools.remote.secret属性。像任何重要的密码或机密一样,该值应唯一且强壮,以免被猜测或强行使用。

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

运行远程客户端应用程序

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

例如,如果您使用的是Eclipse或STS,并且有一个名为my-app的项目已部署到Cloud Foundry,则可以执行以下操作: Run 菜单中选择 Run Configurations… 创建一个新的 Java Application “launch configuration”。 浏览 my-app 项目。 使用 org.springframework.boot.devtools.RemoteSpringApplication 作为主类。 * 将https://myapp.cfapps.io添加到程序参数(或任何远程URL)。

正在运行的远程客户端可能和如下类似:

 .   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: Spring Boot Remote :: 2.2.2.RELEASE

2015-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-project/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code)
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 hierarchy
2015-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 35729
2015-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)

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

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

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

远程更新

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

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

配置文件系统观察器

FileSystemWatcher的工作方式是按一定的时间间隔轮询类更改,然后等待预定义的静默期以确保没有更多更改。然后将更改上传到远程应用程序。在较慢的开发环境中,可能会发生静默期不够的情况,并且类中的更改可能会分为几批。第一批类更改上传后,服务器将重新启动。由于服务器正在重新启动,因此下一批不能发送到应用程序。

这通常通过RemoteSpringApplication日志中的警告来证明,即有关上载某些类失败的消息,然后进行重试。但是,这也可能导致应用程序代码不一致,并且在上传第一批更改后无法重新启动。

如果您经常观察到此类问题,请尝试将spring.devtools.restart.poll-interval和spring.devtools.restart.quiet-period参数增加到适合您的开发环境的值:

1 spring.devtools.restart.poll-interval=2s
2 spring.devtools.restart.quiet-period=1s

现在每2秒轮询一次受监视的classpath文件夹以进行更改,并保持1秒钟的静默时间以确保没有其他类更改。

3.9 打包您的生产应用

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

对于其他“Production ready”功能,例如运行状况,审核和度量REST或JMX端点,请考虑添加spring-boot-actuator。有关详细信息,请参见Spring Boot Actuator:Production-ready Features(此为链接的原文地址,翻译正在进行中)。

3.10 接下来要读什么

现在,您应该了解如何使用Spring Boot以及应遵循的一些最佳实践。现在,您可以继续深入了解特定的Spring Boot功能(此为链接的原文地址,翻译正在进行中),或者可以跳过并阅读有关Spring Boot的“production ready(此为链接的原文地址,翻译正在进行中)”方面的信息。

Spring Boot 2.2.2.RELEASE版本中文文档持续更新中~如有需要获取参考文档文件,关注公众号JavaSo,回复“参考文档”即可。


猜你喜欢

转载自www.cnblogs.com/feizao/p/12076348.html