需要源码请点赞关注收藏和私信博主
前言:热部署的简介和目的
在实际应用开发过程中、业务变化、代码错误等发生时,难免修改程序。为了正确运行出修改的结果,我们往往需要从重启应用,否则将不能看到修改后的效果,这一启动过程时非常浪费时间的,导致开发效率低,因此我们有必要学习Spring Boot开发的热部署,自动实现应用的重启和部署,大大提高 开发和调试效率。
开发热部署的目的是使应用自动 重启和部署,提高开发效率
一、模板引擎的热部署
在Spring Boot应用中,使用模板引擎的页面默认使开启缓存的,如果修改了页面内容,则刷新页面是得不到修改后的页面的效果的。因此可以在配置文件application.properties中关闭模板引擎的缓存
spring.thymeleaf.cache=false 关闭Thymeleaf的缓存
spring.freemarker.cache=false 关闭FreeMarker的缓存
spring.groovy.template.cache=false 关闭Groovy的缓存
二、使用spring-boot-devtools进行热部署
在Spring Boot应用的pom.xml文件中添加spring-boot-devtools依赖即可实现页面和代码的热部署,其最重要的功能是自动实现将修改的应用代码更新到最新的应用上。
1:创建Spring Boot Web应用ch9_1
2:添加spring-boot-devtools依赖
在pom.xml中添加如下代码
<?xml version="1.0" encoding="UTF-8"?> -<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"> <modelVersion>4.0.0</modelVersion> -<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.ch</groupId> <artifactId>ch9_1</artifactId> <version>0.0.1-SNAPSHOT</version> <name>ch9_1</name> <description>Demo project for Spring Boot</description> -<properties> <java.version>11</java.version> </properties> -<dependencies> -<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> -<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> -<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> <!-- MySQL8.x时,请使用8.x的连接器 --> </dependency> <!-- MyBatis-Spring,Spring Boot应用整合MyBatis框架的核心依赖配置 --> -<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency> -<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> -<build> -<plugins> -<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
3:创建控制器类
package com.ch.ch9_1; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestDevToolsController { @RequestMapping("/testDevTools") public String testDevTools() { return "test DevTools 222"; } }
4:运行 Ch91Application主类
然后修改testDevTools方法 改返回值 然后直接刷新页面即可发现结果已经修改 即完成了热部署
三、Spring Boot的单元测试
Spring Boot为测试提供 了一个名为spring-boot-starter-test的Starter 使用STS创建Spring Boot应用时将自动添加上述依赖。它主要提供了以下测试库
1:JNnit:标准的单元测试Java应用程序
2:Spring Test&Spring Boot Test:针对Spring Boot应用程序的单元测试
3:Mockito:Java mocking框架 用于模拟任何Spring 管理的Bean
4:AssertJ:一个流畅的assertion库
5:JSONassert:对JSON对象或JSON字符串断言的库
6:JsonPath:提供类似于Xpath那样的符号来获取JSON数据片段
下面分别通过使用@WebMvcTest和@SpringBootTest两种方式测试一个控制器方法是否满足测试用力
@WebMvcTest
1:创建Spring Boot Web应用ch9_2
2 3步代码可以参照我之前的博客 此处不表
2:修改pom.xml文件 添加mysql依赖
3:修改application.properties内容 配置数据库连接
4:创建持久化实体类
package com.ch.ch9_2.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @Entity @Table(name = "student_table") /**解决No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor异常*/ @JsonIgnoreProperties(value = {"hibernateLazyInitializer"}) public class Student implements Serializable{ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id;//主键 private String sno; private String sname; private String ssex; public Student() { super(); } public Student(int id, String sno, String sname, String ssex) { super(); this.id = id; this.sno = sno; this.sname = sname; this.ssex = ssex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSno() { return sno; } public void setSno(String sno) { this.sno = sno; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } }
5:创建数据访问层
package com.ch.ch9_2.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.ch.ch9_2.entity.Student; public interface StudentRepository extends JpaRepository<Student, Integer>{ }
6:创建控制器
package com.ch.ch9_2.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ch.ch9_2.entity.Student; import com.ch.ch9_2.repository.StudentRepository; @RestController @RequestMapping("/student") public class StudentController { @Autowired private StudentRepository studentRepository; /** * 保存学生信息 */ @PostMapping("/save") public String save(@RequestBody Student student) { studentRepository.save(student); return "success"; } /** * 根据id查询学生信息 */ @GetMapping("/getOne/{id}") public Student getOne(@PathVariable("id") int id){ return studentRepository.getOne(id); } }
7:创建测试用例
包括基于@WebMvcTest的测试用例WebMvcStudentController
基于@SpringBootTest的测试用例SpringBootTestStudentController
需要此处源码可点赞关注收藏后私信博主