220.詳細整理學習spring boot

1.springboot是什麼? 有什麼用?

1.1 是什麼

   一個整合經常使用第三方框架,簡化xml配置,徹底採用註解形式,內置tomcat容器,幫助開發者快速實現項目搭建,spring boot 的web組件默認集成的是springMVC框架css

注意:spring boot 是一個開發框架  並不是微服務html

  1.2 做用

   (1)、簡化項目搭建難度前端

  (2) 、簡化jar配置java

  (3)、大大減小xml 配置mysql

  (4)、內容tomcat容器,開發者無需配置,且端口修改特別容易git

2.開發環境要求

工具(建議):ideaweb

jdk:    Java1.8及以上spring

spring版本:Spring Framework 4.1.5及以上sql

本文采用 Spring Boot 2.1.4 版本調試經過。數據庫

3. spring boot與springMVC  及  spring boot與spring cloud的區別

3.1 spring boot 與springMVC

SpringBoot 是一個快速開發的框架,可以快速的整合第三方框架,簡化XML配置,所有采用註解形式,內置Tomcat容器,幫助開發者可以實現快速開發,SpringBoot的Web組件 默認集成的是SpringMVC框架。

SpringMVC只是控制層框架。

3.2 spring boot 與spring cloud

            SpringBoot 是一個快速開發的框架,可以快速的整合第三方框架,簡化XML配置,所有采用註解形式,內置Tomcat容器,幫助開發者可以實現快速開發,SpringBoot的Web組件 默認集成的是SpringMVC框架。

            SpringCloud依賴與SpringBoot組件,使用SpringMVC編寫Http協議接口,同時SpringCloud是一套完整的微服務解決框架

4.spring boot入門案例

4.1 下載配置 idea 環境

https://my.oschina.net/springMVCAndspring/blog/3032360#h1_52

4.2  springboot入門demo

 

 

 

 

 

   建立的項目 初始化樣式:

編寫功能類

這裏只是controller層

 

 

 

效果:

 

相關代碼:

主函數:

        

package cn.ma.spring_demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//發現@SpringBootApplication是一個複合註解,
// 包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。
//該註解掃面的是該類所在包下面的全部內容 就是 @ComponentScan("cn.ma.spring_demo")
@SpringBootApplication//因此 如何要訪問的類包路徑高於啓動類的包路徑是沒法被訪問到的
public class SpringDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringDemoApplication.class, args);
    }

}

 

相關方法:

/**
 * 公司:
 * 文件名:SpringDemoController
 * 做者:  18392
 * 時間: 2019/4/24 0:07
 * 描述:
 */
package cn.ma.spring_demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController//只能返回字符串  @RestController = @RespnoseBody+ @Controller
public class SpringDemoController {
    /*
    *1.spring boot 入門案例
    * http://localhost:8080/springDemoFunction
     * @Author sunshine
     * @Description //TODO
     * @Date 0:11 2019/4/24
     * @Param []
     * @return java.lang.String
     **/
    @RequestMapping("/springDemoFunction")
    public String springDemoFunction(){
        return "我是spring boot 入門demo";
    }
}

pom中的相關配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.ma</groupId>
    <artifactId>spring_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring_demo</name>
    <description>Demo project for Spring Boot</description>
    <!--1.spring-boot-starter-parent 依賴管理  是借用了maven的繼承特色-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!--2.導入相關jar-->
    <dependencies>
        <!--2.1 springweb 核心組件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--2.2 測試相關jar-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!--3.jdk版本控制-->
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <!--4.可以以Maven的方式爲應用提供Spring Boot的支持,即爲Spring Boot應用提供了執行Maven操做的可能-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

5.springboot中經常使用註解

(1) @RestController
                在上加上RestController 表示修飾該Controller全部的方法返回JSON格式,直接能夠編寫Restful接口

列以下圖:

            

(2)@EnableAutoConfiguration

    做用在於讓 Spring Boot   根據應用所聲明的依賴來對 Spring 框架進行自動配置
這個註解告訴Spring Boot根據添加的jar依賴猜想你想如何配置Spring。因爲spring-boot-starter-web添加了Tomcat和Spring MVC,因此auto-configuration將假定你正在開發一個web應用並相應地對Spring進行設置。

(3) @SpringBootConfiguration

            繼承自@Configuration,兩者功能也一致,標註當前類是配置類,並會將當前類內聲明的一個或多個以@Bean註解標記的方法的實例歸入到srping容器中,而且實例名就是方法名。

 

(4)  @ComponentScan,掃描當前包及其子包下被@Component,@Controller,@Service,@Repository註解標記的類並歸入到spring容器中進行管理。是之前的<context:component-scan>(之前使用在xml中使用的標籤,用來掃描包配置的平行支持)。因此本demo中的User爲什麼會被spring容器管理。

(5) @SpringBootApplication

   @SpringBootApplication是一個複合註解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。

也就是說咱們能夠用後3個來代替  @SpringBootApplication

以下圖:

 

6. web端開發

6.1 靜態資源訪問

訪問效果圖:

6.2 整合web視圖

6.2.1 整合freemaker

第一步:

在src/main/resources/建立一個templates文件夾,後綴爲*.ftl

第二步:引入freeMarker的依賴包

<!-- 2.3 引入freeMarker的依賴包. -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

    第三步:編寫後臺方法

第四步:編寫ftl頁面

 

6.2.2   springboot整合jsp

第1步:springboot的pom中引入jsp相關jar

<!--2.4.1 springboot整合jsp-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!-- 2.4.2 SpringBoot 外部tomcat支持 -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!-- 2.4.3 jstl標籤庫 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

第2步:配置前端位置

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

 

第三步:建立靜態文件防止路徑   看準路徑

第四步:後臺編寫及jsp頁面

效果:

 

7.配置全局捕獲異常

7.1 自定義異常類

/**
 * 公司:馬氏集團
 * 文件名:GlobalExceptionHandler
 * 做者:  18392
 * 時間: 2019/4/26 10:29
 * 描述:
 */
package cn.ma.spring_demo.err;

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    @RequestMapping("/exceptionHandler")
    public  void exceptionHandler(HttpServletResponse response) throws IOException {
        //解決亂碼 及跨域
        response.setContentType("text/html; charset=utf-8");
        response.setHeader("Access-Control-Allow-Origin", "*");//解決json跨域
        HashMap<String, Object> map = new HashMap<>();
        map.put("msg","系統異常!");
        String msg = JSONObject.toJSONString(map);
        PrintWriter out = response.getWriter();
        out.println(msg);
        out.flush();
        out.close();

    }
}

 

效果:

 

8.處理日誌(思想很重要  AOP)

方式有:3種   

        方式一:log4j

        方式二:使用AOP統一處理Web請求日誌

        方式三:lombok插件 打印  放在一級標題 9了(緣由很好用)

8.1  log4j打印日誌

(1)引入相關jar

 

(2) 定義全局變量

//log4j打印日誌
private static final Logger logger = LoggerFactory.getLogger(SpringDemoController.class);

      (3) 經過log4j打印

8.2 使用AOP統一處理Web請求日誌

(1)導入aop相關jar

<dependency>

             <groupId>org.springframework.boot</groupId>

             <artifactId>spring-boot-starter-aop</artifactId>

    </dependency>

(2)  日誌工具類(記得該切點路徑

/**
 * 公司:
 * 文件名:HttpAspect
 * 做者:  18392
 * 時間: 2019/4/26 11:45
 * 描述:
 */
package cn.ma.spring_demo.utils;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Enumeration;
/*
*   做用:獲取用戶請求
*       (1)訪問地址URL
*       (2) 請求方式
*       (3) 請求者IP
*       (4) 請求方法的響應時長
 * @Author sunshine
 * @Description //TODO
 * @Date 13:11 2019/4/26
 * @Param
 * @return
 **/
@Aspect
@Component
public class HttpAspect {
    private static final Logger logger = LoggerFactory.getLogger(HttpAspect.class);
    //切點
    @Pointcut("execution(public * cn.ma.spring_demo.controller.*.*(..))")
    public void webLog() { }

    // System.out.println();// new Date()爲獲取當前系統時間
    long beginTime=0;//開始時間
    long endTime=0;//結束時間
    //前置通知
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Exception {
        //沒抽取的緣由是併發的時候會致使問題 這樣安全性更高
        Date d = new Date();
        long time = d.getTime();
         beginTime =time;

        // 接收到請求,記錄請求內容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 記錄下請求內容
        logger.info("訪問地址URL : " + request.getRequestURL().toString());
        logger.info("請求方式HTTP_METHOD : " + request.getMethod());
        logger.info("訪問者IP : " + request.getRemoteAddr());
        Enumeration<String> enu = request.getParameterNames();
        while (enu.hasMoreElements()) {
            String name = (String) enu.nextElement();
            logger.info("參數name:{},參數value:{}", name, request.getParameter(name));
        }
    }
    //後置通知
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 處理完請求,返回內容
        logger.info("返回內容RESPONSE : " + ret);

        Date d = new Date();
        long time = d.getTime();
      //  long endTime = TimeUtils.getTimeGap();//沒抽取的緣由是併發的時候會致使問題 這樣安全性更高
       long endTime = time;
        logger.info("響應時長(單位毫秒) : " +(endTime-beginTime));
    }


}

效果:

9.Spring Boot集成lombok讓代碼更簡潔

這個插件特別好用  因此用一級標題 編寫

    功能:簡化getXxx/setXxx方法   能夠打印日誌

在idea上安裝教程:

https://www.cnblogs.com/hackyo/p/7998485.html

9.1 簡化getXxx/setXxx方法

效果:

 

使用教程:

       (1) 引入插件

  (2) 實體類上添加註解

@Slf4j
@Data

測試:

        

 

9.2 插件的其餘註解

@Data 標籤,生成getter/setter toString()等方法

@NonNull : 讓你不在擔心而且愛上NullPointerException

@CleanUp : 自動資源管理:不用再在finally中添加資源的close方法

@Setter/@Getter : 自動生成set和get方法

@ToString : 自動生成toString方法

@EqualsAndHashcode : 從對象的字段中生成hashCode和equals的實現

@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor

自動生成構造方法

@Data : 自動生成set/get方法,toString方法,equals方法,hashCode方法,不帶參數的構造方法

@Value : 用於註解final類

@Builder : 產生複雜的構建器api類

@SneakyThrows : 異常處理(謹慎使用)

@Synchronized : 同步方法安全的轉化

@Getter(lazy=true) :

@Log : 支持各類logger對象,使用時用對應的註解,如:@Log4

9.3 @AllArgsConstructor 

@AllArgsConstructor

 

10. springboot整合 mybaties

1. 搭建springboot項目

 

(2)pom中配置jar

<!--1.web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 2.2.1 springboot與mybaties整合jar   -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>
<!--  2.2.2 MySQL 驅動jar -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 2.2.3  mybatis數據庫字段類型映射,將時間類型進行轉換:解決日期映射 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-typehandlers-jsr310</artifactId>
    <version>1.0.1</version>
</dependency>
<!--2.2.4 druid鏈接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.9</version>
</dependency>
<!-- 3. fastjson插件-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>
<!--4.lombook-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
</dependency>

很是重要:

<!--放行xml格式文件-->
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

        

(3) 配置數據源

6.0版本以前的

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root

 

新版mysql:

#1.配置端口
server.port=9000
#2.鏈接數據源
spring.datasource.url=jdbc:mysql://localhost:3306/studydb?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#3.鏈接池的配置信息
spring.datasource.initialSize=5  
spring.datasource.minIdle=5  
spring.datasource.maxActive=20  
spring.datasource.maxWait=60000  
spring.datasource.timeBetweenEvictionRunsMillis=60000  
spring.datasource.minEvictableIdleTimeMillis=300000  
spring.datasource.validationQuery=SELECT 1 FROM DUAL  
spring.datasource.testWhileIdle=true  
spring.datasource.testOnBorrow=false  
spring.datasource.testOnReturn=false  
spring.datasource.poolPreparedStatements=true  
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20  
spring.datasource.filters=stat,wall,log4j  
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 
#4.統一配置實體類包路徑
mybatis.type-aliases-package=cn.ma.sm.pojo
#5.開啓駝峯命名
mybatis.configuration.map-underscore-to-camel-case=true

(4) 建立3層包

(5) 三層代碼

  5.1 controller層

5.2 業務層 

業務層接口:

            

        業務層實現類:

持久岑:

    持久岑接口:

持久岑xml文件:

注意 配置掃包:

 

項目搭建好後的測試:

                

代碼:

        碼雲:https://gitee.com/Luck_Me/springboot

        百度雲:

                連接:https://pan.baidu.com/s/1oPJ2ms9t-6yY27HPxB11TA 
                提取碼:2ovl 

11.springboot定時任務

只須要web的相關jar   不須要添加任何其餘的jar

@EnableScheduling//開啓spring定時任務
//  http://cron.qqe2.com/
//@Scheduled(cron="0 * * * * ?")// 間隔1分鐘執行
@Scheduled(cron = "0/5 * * * * ? ") // 間隔5秒執行
public void reportCurrentTime() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    System.out.println("如今時間:" + dateFormat.format(new Date()));
}

 

 

11.問題整理

11.1 端口被佔用

 

11.2 亂碼 及跨域 (重複代碼 使用AOP解決

//解決亂碼 及跨域
response.setContentType("text/html; charset=utf-8");
response.setHeader("Access-Control-Allow-Origin", "*");//解決json跨域

11.3 經過在application.properties中指定POJO掃描包來讓mybatis自動掃描到自定義POJO

解決方案代碼:

#2.統一配置實體類包路徑
mybatis.type-aliases-package=cn.guang.springboot_mybites.domain

錯誤效果:

配置位置:

11.4 開始駝峯式命名

#3.開啓駝峯命名
mybatis.configuration.map-underscore-to-camel-case=true

問題效果:

開始後的效果:

11.5 xml靜態資源 掃包 及放行

掃包:

@MapperScan("cn.guang.springboot_mybites.mapper")//掃描xml文件路徑

xml 資源放行:(注意代碼 編寫的位置)

<!--放行xml格式文件-->
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
</resources>

 

12. springboot定時任務

@EnableScheduling//開啓spring定時任務
//  http://cron.qqe2.com/
//@Scheduled(cron="0 * * * * ?")// 間隔1分鐘執行
@Scheduled(cron = "0/5 * * * * ? ") // 間隔5秒執行
public void reportCurrentTime() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    System.out.println("如今時間:" + dateFormat.format(new Date()));
}

 

13.springboot攔截器配置

效果:

13.1 自定義攔截器類

/**
 * 公司:馬氏集團
 * 文件名:LoginIntercept
 * 做者:  18392
 * 時間: 2019/4/28 22:35
 * 描述:
 */
package cn.guang.boottime.utils;

import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
    /*
    *  自定義攔截器類
    *  放行註冊  驗證碼   登陸等方法
     * @Author sunshine
     * @Description //TODO
     * @Date 22:49 2019/4/28
     * @Param
     * @return
     **/

@Component
public class LoginIntercept implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //解決亂碼 及跨域
                response.setContentType("text/html; charset=utf-8");
                response.setHeader("Access-Control-Allow-Origin", "*");//解決json跨域
        //本身進行改造   到時候  判斷session區域中是否存在用戶  存在放行 不然到登陸頁面
        System.out.println("開始攔截");
        String token = request.getParameter("token");
        if (StringUtils.isEmpty(token)) {
            response.getWriter().println("請先登陸");//實際上要跳轉頁面的
            return false;
        }
        return true;
    }

}

 

13.2 配置啓動 自定義攔截器類

/**
 * 公司:馬氏集團
 * 文件名:WebConfig
 * 做者:  18392
 * 時間: 2019/4/27 22:27
 * 描述:
 */
package cn.guang.boottime.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/*
* 用於配置啓動 自定義攔截器類
 * @Author sunshine
 * @Description //TODO
 * @Date 22:57 2019/4/28
 * @Param
 * @return
 **/
@Configuration
public class WebConfig implements  WebMvcConfigurer  {

    @Autowired
    private LoginIntercept loginIntercept;//本身定義的

    // 這個方法是用來配置靜態資源的,好比html,js,css,等等
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) { }

    // 這個方法用來註冊攔截器,咱們本身寫好的攔截器須要經過這裏添加註冊才能生效
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns("/**") 表示攔截全部的請求,
        // excludePathPatterns("/login", "/register") 表示除了登錄與註冊以外,由於登錄註冊不須要登錄也能夠訪問
        registry.addInterceptor(loginIntercept).addPathPatterns("/**").excludePathPatterns("/login", "/register");
    }

}

 

 

13.3  改造爲登陸 代碼

效果:

未登陸前:

 

登陸成功 能夠訪問其餘方法

 

代碼編寫:

(1) 配置數據源

(2) 新建 實體類

(3) 三層代碼編寫   controller層簡單處理一下業務

 

 

附上代碼

碼雲:https://gitee.com/Luck_Me/Interceptor/tree/master

百度雲:

        連接:https://pan.baidu.com/s/1aoZAlIlr9bBVwguJ_hVGPg 
        提取碼:saex 

14. 配置靜態資源變量

//注入配置變量
@Value("${ip}")
private  String ip;

 

效果:

 

 

開發步驟:

(1) 配置文件中定義變量

(2) 子須要的類中注入變量對象

(3) 須要的地方調用

   

15.springboot 事務配置及應用

效果:

很簡單  只要在須要事務的方法上加上事務註解便可

@Transactional//開啓事務註解

16. 使用熱部署插件  devtools

 

參考:

    http://www.javashuo.com/article/p-bmxmtjpn-ez.html

 

效果:當後臺代碼改變的時候 該插件幫助咱們自動重啓服務

配置步驟:

(1) 添加相關jar

<!--3.4 熱加載 插件devtools-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
    <scope>true</scope>
</dependency>
<configuration>
    <fork>true</fork>
</configuration>

(2) 設置裏面加上自動編譯

 

效果:

相關文章
相關標籤/搜索