Spring Boot 改完页面需要重启服务的原因及解决方法

背景

在使用 Spring Boot 开发 Web 应用时,我们经常会遇到修改页面后需要重启服务才能看到修改效果的问题。这对于开发调试来说是非常不方便的,因为每次修改页面都需要重新启动服务,耗费了大量的时间。那么,为什么会出现这个问题?如何解决这个问题呢?

原因分析

在 Spring Boot 中,静态资源(如 HTML、CSS、JavaScript 等)默认是缓存到内存中的。当我们修改了页面的静态资源后,Spring Boot 并不会主动去加载最新的资源,而是使用了缓存中的旧资源。因此,我们需要重启服务才能使修改生效。

为了提高应用的性能,Spring Boot 默认会将静态资源缓存到内存中。这样可以减少磁盘 IO 操作,加快页面的加载速度。但是在开发阶段,我们更关注的是修改页面后能够及时看到效果,而不是性能优化。因此,我们需要关闭这个缓存机制。

解决方法

方法一:使用开发时的配置文件

在 Spring Boot 项目的 src/main/resources 目录下,有一个 application.properties(或者 application.yml)文件。这个文件用于配置应用的属性,包括开发环境的属性。

我们可以在这个文件中添加如下配置,来关闭静态资源的缓存:

spring.resources.cache.period=0

或者,如果你使用的是 YAML 格式,可以这样写:

spring:
  resources:
    cache:
      period: 0

这样配置后,Spring Boot 将会关闭静态资源的缓存机制,每次访问页面时都会重新加载最新的资源。

方法二:使用开发时的注解

除了在配置文件中进行配置外,我们还可以使用注解的方式来关闭静态资源的缓存。

在 Spring Boot 的启动类中,我们可以添加 @EnableCaching 注解:

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

然后,在我们修改的 Controller 类上添加 @CacheEvict 注解:

@Controller
public class MyController {

    @GetMapping("/hello")
    @CacheEvict(value = "hello", allEntries = true)
    public String hello() {
        return "hello";
    }
}

这样配置后,每次访问 /hello 路径时,都会清除名为 hello 的缓存,从而使修改生效。

总结

通过上述的配置和注解,我们可以解决 Spring Boot 改完页面需要重启服务的问题。关闭静态资源的缓存机制,每次修改页面后都能及时看到效果,提高开发的效率。

当然,在生产环境中,我们还是建议开启静态资源的缓存,以提高页面的加载速度。这样,当页面不再频繁修改时,可以获得更好的性能体验。

类图如下:

classDiagram
    class Application {
        + main(String[]): void
    }

    class MyController {
        + hello(): String
    }

    Application --> MyController

饼状图如下:

pie
    title 页面刷新方式
    "重启服务" : 60
    "关闭缓存" : 40

希望本文对你理解 Spring Boot 改完页面需要重启服务的原因及解决方法有所帮助!