第2章 开启Spring Boot之旅

第2章 开启Spring Boot之旅

2.1 创建第一个Spring Boot项目

有两种方式来构建Spring Boot项目的基础框架:第一种是使用Spring官网提供的构建页面,第二种是使用IntelliJ IDEA中的Spring插件。

2.1.1 认识Spring Initializr

Spring官方提供了Spring Initializr 英 [ɪ’nɪʃəlaɪzə] 美 [ɪ’nɪʃəlaɪzə] 来进行Spring Boot项目的初始化。这是一个在线生成Spring Boot基础项目的工具,可以将其理解为Spring Boot项目的“初始化向导”,它可以帮助开发人员快速创建一个Spring Boot项目。接下来将讲解如何使用Spring Initializr快速初始化一个Spring Boot骨架工程。

访问Spring官方提供的Spring Initializr网站,官网地址:https://start.spring.io/,打开浏览器并输入Spring Initializr的网站地址,页面如图2-1所示。

从图2-1可以看到Spring Initializr 页面展示的内容。如果想初始化一个Spring Boot项目需要提前对其进行简单的配置,直接对页面中的配置项进行勾选和输入即可。在默认情况下相关配置项已经有缺省值,可以根据实际情况进行简单修改。

在这里插入图片描述

图2-1 Spring Initializr网站

需要配置的参数释义如下所示。

  • Project:表示将要初始化的Spring Boot项目类型,可以选择Maven构建或者Gradle构建,这里选择常用的Maven方式。

  • Language:表示编程语言的选择,支持Java、Kotlin和Groovy。

  • Spring Boot:表示将要初始化的Spring Boot项目所使用的Spring Boot版本。由于版本更新迭代较快,Spring Initializr页面会展示最新的几个Spring Boot版本号。其他的版本号虽然不会在这里展示,但是依然可以正常使用。

  • Project Metada:表示项目的基础设置,包括项目包名的设置、打包方式、JDK版本选择等。

  • Group:即GroupID,表示项目组织的标识符,实际对应Java的包结构,是main目录里Java的目录结构。

  • Artifact :即ArtifactId,表示项目的标识符,实际对应项目的名称,也就是项目根目录的名称。

  • Description :表示项目描述信息。

  • Package name:表示项目包名。

  • Packaging :表示项目的打包方式,有Jar和War两种选择。在Spring Boot项目初始化时,如果选用的方式不同,那么导入的打包插件也有区别。

  • Java:表示JDK版本的选择,有15、11和8三个版本供开发人员选择。

  • Dependencies:表示将要初始化的Spring Boot项目所需的依赖和starter。如果不选择此项的话,在默认生成的项目中仅有核心模块spring-boot-starter和测试模块spring-boot-starter-test。在这个配置项中可以设置项目所需的starter,比如Web开发所需的依赖、数据库开发所需的依赖等。

2.1.1 创建Spring Boot项目

2.1.1.1 使用Spring Initializr初始化项目

在Spring Initializr页面中的配置项需要开发人员逐一进行设置,过程非常简单,根据项目情况依次填写即可。

在本次演示中,开发语言选择Java。因为本地安装的项目管理工具是Maven,在Project项目类型选项中勾选Maven Project。Spring Boot版本选择2.6.2,根据实际开发情况也可以选择其他稳定版本。即使这里已经选择了一个版本号,在初始化成功后也能够在项目中的pom.xml文件或者build.gradle文件中修改Spring Boot版本号。

在项目基础信息中,Group输入框中填写“cn.xueden”,Artifact输入框中填写“springboot-demo”,Name输入框中填写“springboot-demo”,Description输入框中填写“springboot 第一个项目”,Package name输入框中填写“cn.xueden”,Packaging打包方式选择Jar,JDK版本选择8。

由于即将开发的是一个Web项目,因此需要添加web-starter依赖,点击Dependencies右侧的“ADD DEPENDENCIES”按钮,在弹出的弹框中输入关键字“web”并选择“Spring Web:Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.”如图2-2所示。
很明显,该项目将会采用Spring MVC开发框架并且使用Tomcat作为默认的嵌入式容器。
至此,初始化Spring Boot项目的选项配置完成,如图2-3所示。

在这里插入图片描述

图2-2 选择web-starter依赖

在这里插入图片描述

图2-3 初始化Spring Boot项目的选项配置

最后,点击页面底部的“Generate”按钮,即可获取一个Spring Boot基础项目的代码压缩包。

2.1.1.2 使用IDEA编辑器初始化Spring Boot项目

在IDEA编辑器中内置了初始化Spring Boot项目的插件,可以直接新建一个Spring Boot项目,创建过程如图2-4所示。

在这里插入图片描述

图2-4 使用IDEA编辑器初始化Spring Boot项目

需要注意的是,这种方式仅在商业版本的IDEA编辑器中可行。IDEA编辑器社区版本在默认情况下不支持直接生成Spring Boot项目。

2.1.2 项目结构

在使用IDEA编辑器打开项目之后,可以看到Spring Boot项目的目录结构,如图2-5所示。

在这里插入图片描述

图2-5 Spring Boot项目的目录结构图解

Spring Boot的目录结构主要由以下部分组成:

  • src/main/java表示Java程序开发目录,开发人员在该目录下进行业务代码的开发。这个目录对于Java Web开发人员来说应该比较熟悉,唯一的不同是Spring Boot项目中会多一个主程序类。
  • src/main/resources表示配置文件目录,主要用于存放静态文件、模板文件和配置文件。它与普通的Spring项目相比有些区别,该目录下有static和templates两个目录,是Spring Boot项目默认的静态资源文件目录和模板文件目录。在Spring Boot项目中是没有webapp目录的,它默认是使用static和templates两个文件夹。
  • static目录用于存放静态资源文件,如JavaScript文件、图片、CSS文件。
  • templates目录用于存放模板文件,如Thymeleaf模板文件或者FreeMarker文件。
  • src/test/java表示测试类文件夹,与普通的Spring项目差别不大。
  • pom.xml用于配置项目依赖。

以上即为Spring Boot项目的目录结构,与普通的Spring项目存在一些差异,但是在正常开发过程中这个差异的影响并不大。真正差别较大的地方应该是部署和启动方式的差异,接下来将详细介绍Spring Boot项目的启动方式。

2.1.3 pom.xml详解

Spring Boot项目根目录下的pom.xml文件是Maven项目中非常重要的配置文件。pom.xml配置文件主要分为四部分,下面就来一一介绍pom.xml文件的各个组成部分以及它们的作用。

2.1.3.1 项目的描述信息
 <groupId>cn.xueden</groupId>
    <artifactId>springboot-demo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>springboot-demo2</name>
    <description>Demo project for Spring Boot</description>

上面的配置内容基本是创建项目时定义的有关项目的基本描述信息,其中比较重要的是groupId、artifactId。各个属性说明如下:

  • groupId:项目的包路径。
  • artifactId:项目名称。
  • version:项目版本号。
  • packaging:一般有jar、war两个值,表示使用Maven打包时是构建成JAR包还是WAR包。
  • name:项目名称。
  • description:项目描述。
2.1.3.2 项目的依赖配置信息

此部分为项目的依赖信息,主要包括Spring Boot的版本信息和第三方组件的版本信息。示例代码如下:

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/> <!-- lookup parent from repository -->
  </parent>

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>spring-native</artifactId>
            <version>${spring-native.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

项目的依赖信息主要分为parent和dependencies两部分。

  • parent:配置父级项目的信息。Maven支持项目的父子结构,引入后会默认继承父级的配置。此项目中引入spring-boot-starter-parent定义Spring Boot的基础版本。
  • dependencies:配置项目所需要的依赖包,Spring Boot体系内的依赖组件不需要填写具体版本号,spring-boot-starter-parent维护了体系内所有依赖包的版本信息。

另外,标签是Maven项目定义依赖库的重要标签,通过groupId、artifactId等“坐标”信息定义依赖库的路径信息。

2.1.3.3 构建时需要的公共变量
 <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

上面配置了项目构建时所使用的编码、输出所使用的编码,最后指定了项目使用的JDK版本。

2.1.3.4 构建配置

此部分为构建配置信息,这里使用Maven构建Spring Boot项目,所以必须在中添加spring-boot-maven-plugin插件,它能够以Maven的方式为应用提供Spring Boot的支持。

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

上面配置spring-boot-maven-plugin构建插件,将Spring Boot应用打包为可执行的JAR或WAR文件,然后以简单的方式运行Spring Boot应用。如果需要更改为Docker构建方式,则只要更改此部分即可。

2.1.4 第一个helloworld程序

熟悉Spring Boot的项目目录结构以及项目中非常重要的文件pom.xml之后,接下来通过第一个helloworld示例程序演示Spring Boot项目究竟是如何运行的。

步骤01 在目录src\main\java\cn\xueden\helloworld\controller下创建HelloController,然后添加/hello的路由地址和方法,示例代码如下:

@RestController
public class HelloController {
    
    @RequestMapping("/hello")
    public String hello(){
        return "Hello String Boot";
    }
}

在上面的示例中,我们创建了HelloController并创建了一个hello()方法,最后使用@RestController和@RequestMapping注解实现HTTP路由。

1)@RestController表示HelloController为数据处理控制器。Spring Boot中有Controller和RestController两种控制器,都用来表示Spring中某个类是否可以接收HTTP请求,但不同的是:

  • @Controller:返回数据和页面,处理HTTP请求。
  • @RestController:返回客户端数据请求,主要用于RESTful接口。

2)@RequestMapping("/hello")提供路由映射,意思是"/hello"路径的HTTP请求都会被映射到hello()方法上进行处理。

步骤02 运行helloworld程序。

右击项目中的HelloApplication→run命令就可以启动项目,若出现如图2-6所示的内容则表示启动成功。

在这里插入图片描述

图2-6 helloworld项目启动日志

通过系统的启动日志可以看到,系统运行在8080端口。如果需要切换到其他端口,可在application.properties配置文件中自行定义。

步骤03 打开浏览器,访问http://localhost:8080/hello地址,查看页面返回的结果,如图2-7所示。

在这里插入图片描述

图2-7 helloworld数据返回结果

访问/hello地址后,后台成功接收到页面请求并返回“Hello Spring Boot ”,说明我们的第一个Spring Boot项目运行成功。

2.2 启动Spring Boot项目

2.2.1 在IDEA编辑器中启动Spring Boot项目

由于IDEA编辑器对于Spring Boot项目的支持非常友好,在项目导入成功后会被自动识别为Spring Boot项目,可以快速进行启动操作。上面的例子,我们是在主类上右键选择run启动,在IDEA编辑器中,有以下三种方式可以启动Spring Boot项目。

(1)主类上的启动按钮:打开程序启动类,比如本次演示的NewBeeMallApplication. java,在IDEA代码编辑区域中可以看到左侧有两个绿色的三角形启动按钮,点击任意一个按钮即可启动Spring Boot项目。如图2-8所示。

在这里插入图片描述

图2-8 使用主类上的启动按钮启动项目

(2)右键运行Spring Boot的主程序类:与普通Java类的启动方式类似,在左侧Project侧边栏或者类文件编辑器中,执行右键点击操作,可以看到启动main()方法的按钮,点击“Run ‘NewbeeMallApplication.main()’ ”即可启动Spring Boot项目,如图2-9所示。

在这里插入图片描述

图2-9 右键点击运行Spring Boot的主程序类

(3)工具栏中的Run/Debug按钮:点击工具栏中的Run/Debug按钮也可以启动Spring Boot项目,如图2-10所示。

在这里插入图片描述

图2-10 使用工具栏中的按钮启动Spring Boot的主程序类

Spring Boot项目的启动比普通的Java Web项目更便捷,减少了几个中间步骤,不用配置Servlet容器,也不用打包并且发布到Servlet容器再启动,而是直接运行主方法即可启动项目。其开发、调试都十分方便且节省时间。

2.2.2 Maven插件启动

在项目初始化时,配置项选择的项目类型为Maven Project,pom.xml文件中会默认引入spring-boot-maven-plugin插件依赖,因此可以直接使用Maven命令来启动Spring Boot项目,插件配置如下:

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

如果在pom.xml文件中没有该Maven插件配置,是无法通过这种方式启动Spring Boot项目的,这一点需要注意。

Maven插件启动Spring Boot项目的步骤如下:首先点击下方工具栏中的Terminal,打开命令行窗口,然后在命令行中输入命令mvn spring-boot:run并执行该命令,即可启动Spring Boot项目,如图2-11所示。

在这里插入图片描述

图2-11 使用Maven插件启动Spring Boot项目

2.2.3 java-jar命令启动

在项目初始化时,配置项选择的打包方式为Jar,那么项目开发完成打包后的结果就是一个jar包文件。通过Java命令行运行jar包的命令为java -jar xxx.jar,因此可以使用这种方式启动Spring Boot项目,如图2-12所示。

(1)首先点击下方工具栏中的Terminal打开命令行窗口。
(2)然后使用Maven命令将项目打包,执行命令为 mvn clean package -Dmaven.test.skip=true ,等待打包结果即可。

(3)在打包成功后进入target目录,切换目录的命令为cd target。
(4)最后是启动已经生成的jar包文件,执行命令为java -jar springboot-demo-0.0.1-SNAPSHOT.jar。

在这里插入图片描述

图2-12 使用java-jar命令启动Spring Boot项目

需要注意的是,每次在项目启动之前,如果使用了其他方式启动项目工程,则需要将其关掉,否则会因为端口占用导致启动报错,进而无法正常启动Spring Boot项目。

2.3 单元测试

单元测试在日常项目开发中必不可少,Spring Boot提供了完善的单元测试框架和工具用于测试开发的应用。接下来介绍Spring Boot为单元测试提供了哪些支持,以及如何在Spring Boot项目中进行单元测试。

2.3.1 Spring Boot集成单元测试

单元测试主要用于测试单个代码组件,以确保代码按预期方式工作。目前流行的有JUnit或TestNG等测试框架。Spring Boot封装了单元测试组件spring-boot-starter-test。下面通过示例演示Spring Boot是如何实现单元测试的。

步骤01 引入依赖

首先创建Spring Boot项目。在项目中引入spring-boot-starter-test组件,示例配置如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

步骤02 创建单元测试

在src/test目录下新建一个HelloTest测试类,如果只想输出一句“Hello Spring Boot Test”,只需要用一个@Test注解即可。示例代码如下:

@SpringBootTest
public class HelloTest {
    @Test
    public void hello(){
        System.out.println("Hello Spring Boot Test");
    }

}

在类的上面添加@SpringBootTest注解,系统会自动把这段程序加载到Spring Boot容器。@Test注解表示该方法为单元测试方法。

步骤03 运行单元测试

单击Run Test或在方法上右击,再选择“Run ‘hello’”,运行测试方法,运行结果如图2-13所示。

在这里插入图片描述

图2-13 单元测试的运行结果

由图2-13可知,单元测试方法运行成功并输出相应的结果,同时IDEA也会显示运行的所有单元测试结果,包括测试是否通过、运行时间、测试总数和成功次数等。

以上示例中的测试方法只是spring-boot-starter-test组件中的一部分功能,Spring Boot自带的spring-boot-starter-test框架对测试的支持非常完善,包括Web请求测试、Service方法测试等,后面会逐一介绍。

2.3.2 测试Service方法

一般使用Spring Boot进行单元测试主要是针对Service和API(Controller)进行。接下来通过示例演示Spring Boot如何测试Service方法。

步骤01 创建Service测试类

创建Service测试类非常简单,使用IDEA可以一键自动创建单元测试类。首先,选择需要测试的Service类或方法,然后在对应的Service类中右击,选择Go To→Test→Create New Test,打开如图2-14所示的创建测试类界面。

在这里插入图片描述

图2-14 IDEA创建测试类界面

步骤02 实现单元测试

在上面创建好的UserServiceTest类中会自动创建对应的单元测试方法,我们只需要在测试方法中实现对应的测试代码即可,具体的示例代码如下:

@SpringBootTest
class UserServiceImplTest {

    @Autowired
    private IUserService userService;

    @Test
    void getInfo() {
        Assert.assertEquals("xueden", userService.getInfo());
    }
}

如以上示例代码所示,在自动测试类上增加@SpringBootTest注解即可。首先注入需要测试的Service,然后在单元测试中调用该方法,最后通过Assert断句判断返回结果是否正确。
执行单元测试也非常简单,只需将鼠标放在对应的方法上,右击并选择Run执行该方法即可。

2.3.3 测试Controller接口方法

上面是针对Service进行测试,但是有时需要对API(Controller)进行测试,这时需要用到MockMvc类。MockMvc能够模拟HTTP请求,使用网络的形式请求Controller中的方法,这样可以使得测试速度快、不依赖网络环境,而且它提供了一套完善的结果验证工具,测试和验证也非常简单、高效。
spring-boot-starter-test具备强大的Mock能力,使用@WebMvcTest等注解实现模拟HTTP请求测试。下面通过示例演示如何测试Controller接口。

步骤01 创建Controller的测试类HelloControllerTest,实现单元测试方法。示例代码如下:

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;


    @Test
    void hello() throws Exception {

        mockMvc.perform(MockMvcRequestBuilders.post("/hello")   //执行一个请求
                .contentType(MediaType.APPLICATION_JSON))       //接收的数据类型
                .andExpect(status().isOk())  //添加执行完成后的断句,请求的状态响应码//是否为200,如果不是则测试不通过
                .andDo(print()); //添加一个结果处理程序,表示要对结果进行处理,比如此处//使用print()输出整个响应结果信息

    }
}

在上面的示例中,通过使用MockMvc构造一个post请求,MockMvcRequestBuilders可以支持post和get请求,调用print()方法将请求和相应的过程都打印出来。示例代码说明如下:

  • MockMvcRequestBuilders.post("/hello"):构造一个post请求。
  • contentType (MediaType.APPLICATION_JSON)):设置JSON返回编码,避免出现中文乱码的问题。
  • andExpect(status().isOk()):执行完成后的断句,请求的状态响应码是否为200,如果不是则测试不通过。
  • andDo(print()):添加一个结果处理程序,表示要对结果进行处理,比如此处调用print()输出整个响应结果信息。

步骤02 执行单元测试。

完成测试方法之后,执行测试方法:将鼠标放在对应的方法上,右击并选择Run执行该方法即可。可以看到输出如下:

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /hello
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8"]
             Body = null
    Session Attrs = {}

Handler:
             Type = cn.xueden.helloworld.controller.HelloController
           Method = cn.xueden.helloworld.controller.HelloController#hello()

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = null

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"17"]
     Content type = text/plain;charset=UTF-8
             Body = Hello String Boot
    Forwarded URL = null
   Redirected URL = null
          Cookies = []


从上面的输出中可以看到,返回完整的Http Response,包括Status=200、Body = hello Spring Boot,说明接口请求成功并成功返回。

如果接口有登录验证,则需要通过MockHttpSession注入用户登录信息,或者修改登录拦截器取消对单元测试的登录验证。

2.2.4 常用的单元测试注解

在实际项目中,除了@SpringBootTest、@Test等注解之外,单元测试还有很多非常实用的注解,具体说明如表2-1所示。

表2-1 单元测试类常用注解
注释说明
@RunWith(SpringRunner.class)声明测试运行在Spring环境。SpringRunner是SpringJUnit4ClassRunner的新名字,这样做仅仅是为了让名字看起来更简单一点
@SpringBootTest用于Spring Boot应用测试,它默认会根据包名逐级往上找,一直找到Spring Boot主程序,通过类注解是否包含@SpringBootApplication来判断是否为主程序,并在测试时启动该类来创建Spring 上下文环境
@BeforeClass用来静态修饰方法,该方法会在所有测试方法执行之前执行一次
@BeforeEach用来修饰方法,该方法会在每一个测试方法执行之前执行一次
@Test测试方法,在这里可以测试期望异常和超时时间
@AfterEach用来修饰方法,该方法会在每一个测试方法执行之后执行一次
@AfterClass用来静态修饰方法,该方法会在所有测试方法执行之后执行一次
@Ignore忽略的测试方法

2.4 开发环境热部署

本节介绍Spring Boot非常实用的功能:开发环境热部署。在实际的项目开发调试过程中会频繁地修改后台类文件,导致需要重新编译、重新启动,整个过程非常麻烦,影响开发效率。下面介绍Spring Boot如何解决这个问题。

2.4.1 devtools实现原理

我们在开发调试Spring Boot项目时,需要经历重新编译、重新启动程序的过程。由于系统启动时,需要加载一系列的组件和依赖包,因此整个过程非常耗时,大大影响开发效率。

Spring Boot在这方面做了很好的支持,提供了spring-boot-devtools组件,使得无须手动重启Spring Boot应用即可重新编译、启动项目,大大缩短编译、启动的时间,从而提高开发效率。

spring-boot-devtools的核心是两个类加载器(ClassLoader):一个是Base类加载器(Base ClassLoader),负责加载那些不会改变的类,如第三方JAR包等;另一个是Restart类加载器(Restart ClassLoader),负责加载那些正在开发的会改变的类。这样如果只修改Java代码,devtools只会重新加载被修改的类文件,不会重新加载其他第三方的JAR包,所以重启较快,从而达到热部署的效果。

我们在项目中引入devtools组件之后,devtools会监听classpath下的文件变动,当文件被修改时会重新编译,重新生成类文件;devtools监听到类文件变动,触发Restart类加载器重新加载该类,从而实现类文件和属性文件的热部署。

需要注意的是,并不是所有的更改都需要重启应用(如静态资源、视图模板)。我们可以通过设置spring.devtools.restart.exclude属性来指定一些文件或目录的修改不用重启应用。例如,可以设置/static和/public下的所有文件更新都不触发应用重启。

2.4.2 配置开发环境热部署

步骤01 在pom.xml配置文件中添加dev-tools依赖。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

在上面的示例中,使用 英 [ˈɒpʃənl] 美 [ˈɑːpʃənl] optional=true表示依赖不会传递,即该项目依赖devtools;其他项目如果引入此项目生成的JAR包,则不会包含devtools,如果想要使用devtools,则需要重新引入。

步骤02 在application.properties中配置devtools。

# 热部署生效
spring.devtools.restart.enabled=true
# 设置重启的目录
spring.devtools.restart.additional-paths=src/main/java
# classpath目录下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude=WEB-INF/**

上面的配置主要是打开devtools热部署,然后指定监控的后台文件目录,最后指明文件变更不需要重新编译部署的目录。配置完成之后,devtools会监听classpath下的文件变动,并且会立即重启应用。

需要注意的是,devtools也可以实现前台页面热部署,即页面修改后会立即生效,需要在application.properties文件中配置spring.thymeleaf.cache=false,以指定不缓存前端页面。

步骤03 验证配置是否生效。

配置完成后,需要验证热部署是否生效。首先启动项目,修改项目中的某个java文件,然后在IDEA后台可以看到devtools自动重启应用,后台日志输出如图2-15所示。

在这里插入图片描述

图2-15 devtools项目重启日志

我们手动修改java后台代码就会发现Spring Boot已经重新编译该文件,然后自动重新加载,无须手动重启。

2.4.3 使用JRebel插件实现热部署

JRebel是一套JavaEE开发工具, 可快速实现热部署,节省了大量重启时间,提高了个人开发效率。 它使得JAVA程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

步骤01 安装插件

打开IDEA编辑器依次选择File→Settings→Plugins,在搜索框输入jrebel,如图2-16所示。

在这里插入图片描述

图2-16 安装JRebel插件

步骤02 在线生成GUID

打开浏览器输入地址:https://www.guidgen.com/,如图2-17所示.

在这里插入图片描述

图2-17 在线生成GUID

如果失效刷新GUID替换就可以!

步骤03 打开jrebel 面板,选择Connect to online licensing service,如图2-18所示。

在这里插入图片描述

图2-18 jrebel面板

安装成功之后就可以通过JRebel启动项目。这样修改完Java代码后,就可以通过快捷键 Ctrl+shift+F9 而不再需要重启站点这样繁琐浪费时间的操作了。

步骤04 设置成离线工作模式

打开IDEA编辑器依次选择File→Settings→JRebel&XRebel,点击"Work offine",点击之后出现如图2-19所示效果。

在这里插入图片描述

图2-19 设置离线工作模式

步骤05 设置自动编译

要想实现热部署,首先需要对Intellij按如下进行设置:

1) 由于JRebel是实时监控class文件的变化来实现热部署的,所以在idea环境下需要打开自动变异功能才能实现随时修改,随时生效。 如图2-20所示。

在这里插入图片描述

图2-20 设置自动编译

2)打开运行时编译,设置compiler.automake.allow.when.app.running

按快捷键 Ctrl+Shift+Alt+/ ,选择 Registry ,如图2-21和图2-22所示。

在这里插入图片描述

图2-21 选择 Registry

在这里插入图片描述

图2-22 打开运行时编译

步骤06 使用 运行项目时要点击图中红框中的按钮,即可运行,如图2-23所示。

在这里插入图片描述

图2-23 使用JRbel运行项目

第一个按钮是Run,第二个按钮是Debug。

修改代码后,按快捷键 Ctrl + Shift + F9,运行后会提示有变化是否重新加载,选yes。完成加载以后,就已经实现了热更新效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨鱼老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值