🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # spring loaded方式 Spring Loaded是一个用于在JVM运行时重新加载类文件更改的JVM代理,Spring Loaded允许你动态的新增/修改/删除某个方法/字段/构造方法,同样可以修改作用在类/方法/字段/构造方法上的注解.也可以新增/删除/改变枚举中的值。 spring-loaded是一个开源项目,项目地址:[https://github.com/spring-projects/spring-loaded](https://github.com/spring-projects/spring-loaded) Spring Loaded有两种方式实现,分别是Maven引入依赖方式或者添加启动参数方式 ~~~ <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.6.RELEASE</version> </dependency> </dependencies> </plugin> ~~~ 启动:`mvn spring-boot:run` ![](https://img.kancloud.cn/e4/f4/e4f48d40efda4bd3ffcc387d06103f83_936x1216.png) 注意:maven依赖的方式只适合spring-boot:run的启动方式,右键那种方式不行 出现如下配置表实配置成功 ~~~ [INFO] Attaching agents: [C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar] ~~~ **添加启动参数方式** 这种方式是右键运行启动类 首先先下载对应的springloaded-1.2.6.RELEASE.jar,可以去上面提到的官网获取 博主这里直接引用maven依赖已经下载好的路径哈 然后打开下图所示的Edit Configurations配置,在VM options中输入: ~~~ -javaagent:C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify ~~~ ![](https://img.kancloud.cn/2c/e0/2ce0d4071090e9700f0cd8dfbc8b0e63_1728x404.png) 然后直接右键运行启动类即可启动项目。 上面2种方式小伙伴随便选择一种即可,当系统通过 mvn spring-boot:run启动或者 右键application debug启动Java文件时,系统会监视classes文件,当有classes文件被改动时,系统会重新加载类文件,不用重启启动服务。 > 注:IDEA下需要重新编译文件 Ctrl+Shift+F9或者编译项目 Ctrl+F9 如何测试热部署是否可用呢,你可以先写个简单的Controller方法,返回个字符串,然后启动项目,接着修改下这个方法返回的字符串,Ctrl+Shift+F9编译下当前类,然后再刷新下页面看看是否内容改变了。 在 Spring Boot,模板引擎的页面默认是开启缓存,如果修改页面内容,刷新页面是无法获取修改后的页面内容,所以,如果我们不需要模板引擎的缓存,可以进行关闭。 ~~~ spring.freemarker.cache=false spring.thymeleaf.cache=false spring.velocity.cache=false ~~~ 发现大多数情况可以使用热部署,有效的解决了文章头部中提到的那个痛点,不过还是有一些情况下需要重新启动,不可用的情况如下: 1. 对于一些第三方框架的注解的修改,不能自动加载,比如:spring mvc的@RequestMapping 2. application.properties的修改也不行 3. log4j的配置文件的修改不能即时生效 # spring-boot-devtools **idea** idea配置文件`make project automatically` ![](https://img.kancloud.cn/3a/ab/3aab81aa2e7475e318413884c89f4af8_1076x486.png) CTRL + SHIFT + A --> 查找Registry --> 找到并勾选compiler.automake.allow.when.app.running ![](https://img.kancloud.cn/03/a5/03a521f7f256285621dc01711e9652ea_874x46.png) 最后重启idea 加maven依赖 将依赖关系标记为可选`<optional>true</optional>`是一种最佳做法,可以防止使用项目将devtools传递性地应用于其他模块。 ~~~ <!--添加热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,需要重新引入 --> <optional>true</optional> <scope>runtime</scope> </dependency> ~~~ 开启热部署 ~~~ <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 如果没有该项配置,devtools不会起作用,即应用不会restart--> <fork>true</fork> </configuration> </plugin> </plugins> </build> ~~~ **默认属性** 在Spring Boot集成Thymeleaf时,`spring.thymeleaf.cache`属性设置为false可以禁用模板引擎编译的缓存结果。 现在,devtools会自动帮你做到这些,禁用所有模板的缓存,包括Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache等。 更多的属性,请参考[DevToolsPropertyDefaultsPostProcessor](https://github.com/spring-projects/spring-boot/blob/v1.5.3.RELEASE/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java)。 **自动重启** 自动重启的原理在于spring boot使用两个classloader:不改变的类(如第三方jar)由base类加载器加载,正在开发的类由restart类加载器加载。应用重启时,restart类加载器被扔掉重建,而base类加载器不变,这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为base类加载器已经可用并已填充。 **排除静态资源文件** 静态资源文件在改变之后有时候没必要触发应用程序重启,例如thymeleaf模板文件就可以实时编辑,默认情况下,更改/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates下的资源不会触发重启,而是触发live reload(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新,下面会介绍)。 ~~~ spring: thymeleaf: cache: false devtools: restart: enabled: true additional-paths: src/main/java exclude: WEB-INF/** ~~~ 可以使用spring.devtools.restart.exclude属性配置,例如 ~~~ spring.devtools.restart.exclude=static/**,public/** ~~~ 如果想保留默认配置,同时增加新的配置,则可使用 ~~~ spring.devtools.restart.additional-exclude属性 ~~~ **观察额外的路径** 如果你想观察不在classpath中的路径的文件变化并触发重启,则可以配置 spring.devtools.restart.additional-paths 属性。 不在classpath内的path可以配置spring.devtools.restart.additionalpaths属性来增加到监视中,同时配置spring.devtools.restart.exclude可以选择这些path的变化是导致restart还是live reload。 **关闭自动重启** 设置 spring.devtools.restart.enabled 属性为false,可以关闭该特性。可以在application.properties中设置,也可以通过设置环境变量的方式。 ~~~ public static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApp.class, args); } ~~~ **使用一个触发文件** 若不想每次修改都触发自动重启,可以设置spring.devtools.restart.trigger-file指向某个文件,只有更改这个文件时才触发自动重启。 **自定义自动重启类加载器** 默认时,IDE中打开的项目都会由restart加载器加载,jar文件由Base加载器加载,但是若你使用multi-module的项目,并且不是所有模块都被导入到IDE中,此时会导致加载器不一致。这时你可以创建META-INF/spring-devtools.properties文件,并增加restart.exclude.XXX,restart.include.XXX来配置哪些jar被restart加载,哪些被base加载。如: ~~~ restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar ~~~ **LiveReload** DevTools内置了一个LiveReload服务,可以在资源变化时用来触发浏览器刷新。当然这个需要你浏览器安装了LiveReload插件,并且启动这个插件才行。很有意思,这里介绍下如何弄。 先去谷歌商店安装LiveReload插件 安装好在要自动刷新的页面点击下图中图标,启动应用后更新页面内容或者css等都会触发页面自动刷新了。如下图,圈中的就是,点一下会变黑就是启动了。 最后展示效果,修改完html页面后,Ctrl+Shift+F9,没有重启,页面也会自动刷新了,太有趣了。 如果您不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false。 一次只能运行一个LiveReload服务器。开始应用程序之前,请确保没有其他LiveReload服务器正在运行。 如果你的IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。