2.6 SpringBoot热加载
spring-boot-devtools
是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去,即在我们改变了一些代码或者配置文件的时候,应用可以自动重启,这在我们开发的时候,非常有用。
原理是在发现代码有更改之后,重新启动应用,但是比速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader
,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)。
在SpringBoot1.3.1之后,devtools已经正式发布到Maven中央仓库,只要进行如下配置即可:
<parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>1.3.1.RELEASE</version> </parent> <dependencies> ... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> ... <dependencies>
由于在SpringBoot1.3.1.RELEASE之前,devtools仅在 Spring milestone repository.仓库中提供,所以需要在POM.XML 文件中配置仓库地址。
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>http://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
然后更改parent标签
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.M2</version> </parent>
最后添加 模块依赖即可
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
默认情况下,修改了/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public或者/templates目录下的内容不会引起应用的重新启动。意思是,java代码,pom文件,application.properties(yml)文件的修改都会引起重新启动。
通过以下方式,我们可以指定只有哪些目录下的内容修改不会引起重启:
spring.devtools.restart.exclude=static/**,public/**
以上配置说明只有static目录和public目录下的内容修改后不会引起重启。由于默认的配置已经比较合理,所以我们进行上述配置,一种可能的情况是,我们希望在默认的配置下,添加其他目录下内容修改时也不重新启动,将spring.devtools.restart.exclude改为spring.devtools.restart.additional-exclude即可。