使用Spring Boot DevTools加快开发速度(二)

简介: DevTools 支持自动刷新与自动重启 –自动刷新(或自动加载)是指在浏览器中重新加载UI,以查看静态内容的更改。自动重新启动是指重新加载服务器端代码和配置,然后重新启动服务器。

远程连接


除了本地开发之外,您还可以连接到运行DevTools的远程应用程序。这不适用于生产环境,因为它可能会带来严重的安全风险。但是,它在预生产环境中可能非常有用。


启用远程连接

默认情况下不启用远程连接。您需要通过修改pom文件显式启用它:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludeDevtools>false</excludeDevtools>
            </configuration>
        </plugin>
    </plugins>
</build>

或使用gradle,您需要设置 excludeDevtools = false:

bootWar {
    excludeDevtools = false
}

然后,您需要设置一个秘密密码,以便在连接到远程应用程序时用于身份验证

spring.devtools.remote.secret=somesecret


连接到远程应用

远程应用程序运行后,您可以启动远程连接会话。现在,您所需要做的就是以org.springframework.boot.devtools.RemoteSpringApplication远程应用程序的URL作为参数启动。请注意,如果可能,应使用https。

C7M1W_Z9_YOFUK8ZX9XQ0F4.png

在您的IDE中,运行远程连接非常容易。在IDEA中,您只需创建一个新的运行配置。转到Run → Edit Configurations...并使用左上角的[+]图标创建新配置。选择Application类型。

作为Main类,RemoteSpringApplication从DevTools模块中选择,并作为程序参数传递远程应用程序的URL。

IDEA中的远程连接配置

运行此配置后,如果与远程应用程序的连接成功,您应该会看到类似的输出。

.   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: Spring Boot Remote ::  (v2.0.6.RELEASE)
2018-11-02 17:24:42.126  INFO 16640 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication v2.0.6.RELEASE on DESKTOP-6NJV4ON with PID 16640 (C:\Users\vojte\.m2\repository\org\springframework\boot\spring-boot-devtools\2.0.6.RELEASE\spring-boot-devtools-2.0.6.RELEASE.jar started by vojte in C:\projects\rest-docs-starter)
2018-11-02 17:24:42.130  INFO 16640 --- [           main] o.s.b.devtools.RemoteSpringApplication   : No active profile set, falling back to default profiles: default
2018-11-02 17:24:42.172  INFO 16640 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@3daa422a: startup date [Fri Nov 02 17:24:42 CET 2018]; root of context hierarchy
2018-11-02 17:24:42.679  WARN 16640 --- [           main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2018-11-02 17:24:42.800  WARN 16640 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : Unable to start LiveReload server
2018-11-02 17:24:42.829  INFO 16640 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 1.212 seconds (JVM running for 1.877)

连接到远程应用程序后,DevTools会监视类路径更改,就像本地开发一样。但是,它代替本地重启,而是将更改推送到远程服务器并触发那里的重启。这可能比构建应用程序并将其部署到远程计算机快得多。


全局配置

您可以像其他任何Spring应用程序一样使用配置属性来配置 DevTools。这通常意味着编辑 application.properties 项目。对于每个应用程序,此配置都是单独的。

但是,在某些情况下,为在同一台计算机上运行的所有应用程序进行全局配置可能会很方便。您可以在 $HOME 目录中创建一个名为 .spring-boot-devtools.properties 的属性文件。该文件中声明的配置适用于所有运行DevTools的应用程序。


局限性


实时重加载

使用 DevTools 的 Spring 应用程序会自动启动 LiveReload 服务器。不幸的是,该服务器只能同时运行一个实例。更准确地说,只有第一个可以工作。这不仅适用于带有 DevTools 的 Spring 应用程序的多个实例,而且还适用于任何其他在后台使用LiveReload 的应用程序,例如处于开发模式的Gatsby

如果您想配置 Spring 应用程序使其不启动 LiveReload 服务器,则可以在以下代码中进行操作 application.properties

spring.devtools.livereload.enabled=false


关机钩

DevTools 依赖于关闭挂钩的 SpringApplication。如果您使用以下方式手动禁用了挂接,它将无法正常工作:

springApplication.setRegisterShutdownHook(false);

默认情况下,挂钩是启用的,因此除非明确禁用它,否则您不必担心。

与第三方库的冲突

尽管DevTools通常应该可以正常运行,但它可能与第三方库有冲突。特别是,使用standard进行反序列化存在一个已知ObjectInputStream 问题

如果发生此类冲突,可以通过设置以下方式禁用自动重启:

spring.devtools.restart.enabled=false

重新启动将不再被触发。但是,仍将使用重新启动类加载器。如果您需要完全禁用类加载器,则需要在启动应用程序之前这样做:

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

即使您不使用自动重启,您仍然可以从DevTools提供的其他功能中受益。


启用延迟初始化

您可以使用 @Lazy 注释将各个bean标记为延迟初始化。这个功能在Spring已经有一段时间了。从 Spring Boot 2.2 开始,您可以使用切换所有 bean 的延迟初始化spring.main.lazy-initialization=true。可以单独使用它,也可以将它与 DevTools 组合使用,以更快地重启。

DevTools可以在同一JVM中热重启您的应用程序。热重启的一个重要好处是,它为JIT提供了更多机会来优化启动应用程序所涉及的代码。重启几次后,原来的2500ms时间减少了近80%,接近500ms。通过延迟初始化,我们可以做得更好。设置 spring.main.lazy-initialization 可以看到我们的应用程序直接在IDE中在400毫秒内重新启动。

在生产应用程序中对所有bean使用延迟初始化是有问题的。它为启动提供了出色的性能提升,但代价是单个 Bean 的首次请求时间较长。更重要的是,您的应用程序不再快速失败。它不会在启动应用程序时立即崩溃,而只会在直接请求配置错误的bean之后失败。这可能非常危险,因为直到为时已晚,您才发现很多错误。尽管如此,大规模延迟初始化对于加快开发时间还是很有用的,因为在使用某些功能时,您通常只在应用程序的一部分上工作,而其余部分则不使用。理想的折衷方法是仅对本地开发启用大规模延迟初始化(假设使用spring配置文件),而对于已部署的更高环境禁用它。


结论


通过提供自动重启和 LiveReload 功能,DevTools 使您的 Spring Boot 应用程序开发更加轻松快捷。除此之外,它还将各种属性设置为更适合本地开发的值。此外,它允许您远程连接到应用程序,并且仍使用其大多数功能。在生产环境中运行时,不使用 DevTools。有关详细信息,请参阅官方文档。

相关文章
|
3天前
|
IDE Java 开发工具
Spring Boot:加速Java后端开发的现代化利器
在当今快速迭代的软件开发环境中,Spring Boot 已成为Java后端开发领域的首选框架。作为Spring家族的一员,它以“约定优于配置”的设计理念,极大地简化了传统Spring应用的配置和部署过程,让开发者能够更加专注于业务逻辑的实现。本文将探讨Spring Boot的核心优势,并通过一个简单的示例展示如何快速启动一个基于Spring Boot的Java Web应用。
16 1
|
2天前
|
消息中间件 设计模式 监控
Spring Boot中的消息驱动开发
Spring Boot中的消息驱动开发
|
5天前
|
Java 开发者 Spring
从入门到精通,Spring 框架带你玩转 Java 企业应用开发!
【6月更文挑战第25天】Spring框架简化了Java企业开发,通过依赖注入降低耦合,如使用构造函数注入`UserService`中的`UserDao`。它还提供声明式事务管理,如`@Transactional`注解自动处理事务,减少手动错误。此外,Spring的AOP支持允许在不侵入业务逻辑的情况下实现横切关注点,如`LoggingAspect`所示。无论是新手还是资深开发者,Spring以其全面的功能和灵活性成为企业应用开发的强大工具。
|
5天前
|
前端开发 Java 开发者
Spring 框架:Java 企业应用开发领域的“隐形冠军”!
【6月更文挑战第25天】Spring框架在Java开发中扮演重要角色,提倡依赖注入、事务管理及面向切面编程的最佳实践。例如,通过`@Autowired`实现接口注入,保持代码松耦合;使用`@Transactional`确保数据一致性;借助`@Aspect`定义AOP切面,分离关注点;使用Java配置增强可维护性;以及在Spring MVC中利用注解驱动提升Web应用效率。遵循这些最佳实践,开发者能打造高效、可扩展的应用。
|
2天前
|
消息中间件 设计模式 监控
Spring Boot中的消息驱动开发
Spring Boot中的消息驱动开发
|
3天前
|
Java 机器人 程序员
Spring Boot中的事件驱动开发
Spring Boot中的事件驱动开发
|
4天前
|
Java Nacos 微服务
Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册
Spring Cloud微服务在Windows本地开发时禁用Nacos注册中心注册
|
5天前
|
小程序 Java Maven
springboot开发微信小程序
springboot开发微信小程序
9 0
|
5天前
|
Java 开发者 Spring
Spring 框架:Java 企业应用开发的“瑞士军刀”,一网打尽所有需求!
【6月更文挑战第25天】Spring框架是Java开发的“瑞士军刀”,以其DI(依赖注入)减少手动管理,提高效率。AOP(面向切面编程)实现非侵入式关注点分离,如日志和事务管理。@Transactional注解简化事务处理,Web支持使Web应用开发更便捷。通过这些工具,Spring解决了复杂需求,增强了代码的可维护性和性能。
|
5天前
|
Java
springboot自定义拦截器,校验token
springboot自定义拦截器,校验token
20 6