2.6 SpringBoot热加载

2016-02-24 22:01:43 7,154 0


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即可。