Spring Boot第二弹:Spring Boot热插拔

Spring Boot热插拔


小弟刚接触spring boot不久,仅想通过写网志的形式来加深记忆和方便以后查阅。如内容有不正确之处,还望各位大佬海量汪涵,并给小弟指出,共同进步。


1.概述

**由于Spring Boot应用程序只是纯java应用程序,所以JVM热插拔可开箱即用(Spring-boot-devtools)。

spring-boot-devtools模块可以包含在任何项目中,以提供额外的开发功能,添加maven依赖:**

<dependencies> 
    <dependency> 
        <groupId> org.springframework.boot </groupId> 
        <artifactId> spring-boot-devtools </artifactId> 
        <optional> true </optional> 
    </dependency> 
</dependencies>

2.属性默认值

Spring Boot支持的几个库使用缓存来提高性能。例如,模块引擎将编译的模板存入缓存,以避免重复解析模板文件。此外SpringMVC可以在服务静态资源时向响应添加Http头。


3.自动重启

使用spring-boot-devtools会在类路径上的文件发生更改时自动重新启动。但默认情况下有些资源(如静态资源和视图模板)不需要重新启动应用程序。


3.1触发重新启动

当DevTools监视类路径资源时,触发重新启动的唯一方法是更新类路径。

DevTools的工作依赖于应用程序上下文的shutdown hook,如果禁用了shutdown hook,在application配置文件中配置SpringApplication.setRegisterShutdownHook(false),将无法正常工作。


3.2重新启动与重新加载

Spring Boot提供的重新启动技术使用两个类加载器。不更改的类(如,第三方jar)被加载到基类加载器中;正在积极开发的类被加载到重新启动类加载器中。当应用程序重新启动时,重新启动类加载器将被丢弃,并重新创建一个重新启动类加载器。

如果重新启动不够快或者类加载有问题,可采用重新加载技术。


4.排除加载资源

在开发中某些资源在更改时不一定需要触发重新启动,可使用自定义排除项,spring.devtools.restart.exclude属性来排除。

如:spring.devtools.restart.exclude = static/**

如果要保留默认值然后添加排除项,可使用spring.devtools.restart.additional-exclude属性。


5.添加附加路径

当对不在类路径中的文件进行更改时,可能需要重新启动或重新加载应用程序。可在application配置文件中使用spring.devtools.restart.additional-paths属性配置其它路径来更改监视。


6.禁用重新启动

如果不想使用重新启动功能,可使用spring.devtools.restart.enabled属性来禁用。

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

7.自定义重新启动类加载器

如上述所讲,重新启动类功能通过使用两个类加载器来实现的,对于大多数应用程序来说,该形式很好。

默认情况下,IDE或Eclipse中任何打开的项目都将使用“重新启动”类加载器加载,如果在多模块项目上工作,而不是将每个模块都导入IDE或Eclipse中,则可能需要自定义事件。

可创建一个META-INF/spring-devtools.properties文件,该文件包含restart.exclude.和restart.include.前缀属性。include表示放入到类加载器的项目(更改后不自动启动),exclude表示不放入到类加载器的项目。


8.缺陷

重新启动功能对使用标准反序列化的对象无效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章