快速搭建SpringBoot3.x項目

来源:https://www.cnblogs.com/xiezhr/archive/2023/09/17/17708711.html
-Advertisement-
Play Games

寫在前面 上一小節中我們從0到1 使用Vite搭建了一個Vue3項目,並集成了Element Plus 實現了一個簡單的增刪改查頁面。 這一篇中我們將使用IDEA快速搭建一個SpringBoot3.x的項目。 一、創建項目 1、File->new->project 2、選擇“Spring Initi ...


寫在前面

上一小節中我們從0到1 使用Vite搭建了一個Vue3項目,並集成了Element Plus 實現了一個簡單的增刪改查頁面。

這一篇中我們將使用IDEA快速搭建一個SpringBoot3.x的項目。

一、創建項目

1、File->new->project

新建項目

2、選擇“Spring Initializr”,點擊next;

Spring Initializr

3、選擇spring boot版本及添加相關依賴

這一步我們需要選擇springboot版本,及Dependencies信息,當然了Dependencies 不是必須選擇的。可以在項目建好之後需要什麼添加什麼。

簡要說明:我們這裡選擇了四個Dependencies

  • Lombok : 需要我們先安裝Lombok插件,可以簡化實體類書寫
  • String Web:添加項目的web支持
  • MySQL Driver:我們用到MySQL資料庫,所以添加MySQL相關驅動
  • MyBatis Framework:我們用到MyBatis這一ORM框架操作資料庫

springboot版本

4、創建好的項目結構

項目結構

5、配置Maven

在這裡配置本地Maven本地路徑、Maven倉庫。在本地Maven的settings.xml中會配置maven的鏡像資源等信息

配置Maven

6、 下載相關依賴

在這裡我們下載之前配置好的依賴,一般項目創建後會預設下載

下載依賴

二、配置多環境

在實際開發中,我們一般都會有好幾套運行環境。比如①開發環境 ②測試環境 ③ 生產環境等等

我們不可能每次都去修改一個配置文件,這就顯得很麻煩。下麵我們主要說一說怎麼配置多環境

① 修改application.properties 配置文件

idea創建的springboot項目,預設的配置文件是application.properties。我們這裡將application.properties修改成application.yml。

為什麼這麼修改呢?因為yml文件配置起來比較方便,可以省略好多冗餘內容,當然了你不改也是沒啥問題的。

修改後的applicatio.yml文件如下,通過active:屬性來切換環境

spring:
  application:
    name: springbootdemo
  profiles:
    active: dev

②添加開發環境配置

新建application-dev.yml 文件,在這裡我們就可以配置開發環境下的埠,資料庫連接等信息,具體內容如下

  • server.port 屬性,指定應用程式在伺服器上監聽的埠號。這裡設置為8080
  • spring.datasource 屬性,配置應用程式與資料庫的連接
    • driver-class-name 指定資料庫驅動程式的類名
    • url 指定資料庫的連接地址,這裡是本地MySQL資料庫的地址和埠號以及資料庫名稱
    • usernamepassword 分別指定連接資料庫所需的用戶名和密碼
  • spring.mybatis.mapper-locations 屬性,指定MyBatis映射器XML文件的位置。這裡配置為 classpath:mapper/*.xml ,表示映射器文件位於classpath下的mapper目錄中
server:
  port: 8080    # 配置埠為8080

spring:
  datasource:
    driver-class-name:  com.mysql.jdbc.Driver   
    url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456
mybatis:
    mapper-locations: classpath:mapper/*.xml

③ 添加生產環境配置

新建application-prod.yml文件,這裡配置的是生產環境。具體內容如下,配置一樣的,只是各種換成了生產的

server:
  port: 8989

spring:
  datasource:
    driver-class-name:  com.mysql.jdbc.Driver
    url: jdbc:mysql://www.xiezhrspace.cn:3308/mybatisdemo?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456
mybatis:
    mapper-locations: classpath:mapper/*.xml

以上配置好之後,我們就可以啟動springboot項目

啟動項目

瀏覽器輸入:http://localhost:8080 後出現如下內容,說明項目啟動成功

項目啟動成功

三、連接資料庫查詢數據

通過之前的步驟,我們的springboot項目已經可以正常運行起來了,接下來我們就從資料庫中獲取數據並通過json格式返回前臺

3.1 新建資料庫mybatisdemo並且創建sys_user表

DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用戶名',
  `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶昵稱',
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶密碼',
  `sex` enum('1','2') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶性別',
  `birthday` date NULL DEFAULT NULL COMMENT '用戶生日',
  `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶郵箱',
  `phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶電話',
  `addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶地址',
  `stop_flag` enum('1','0') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用戶啟用標誌',
  `create_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '用戶創建時間',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '用戶更新時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `sys_user` VALUES (1, 'xiezhr', '程式員小凡', '12345678', '1', '1999-09-19', '[email protected]', '13288888888', '雲南省昆明市', '0', '2023-09-04 21:08:32', NULL);
INSERT INTO `sys_user` VALUES (2, 'xiaoqi', '程式員曉柒', '123456', '1', '2020-10-04', '[email protected]', '13288888888', '雲南文山', '0', '2023-09-04 21:09:42', NULL);
INSERT INTO `sys_user` VALUES (3, 'xiaodeng', '財務小鄧', '123456', '2', '2019-09-04', '[email protected]', '13588888888', '雲南文山', '0', '2023-09-04 21:10:43', NULL);

表結構

3.2 創建實體類

創建與表結構一致的實體類SysUser

@Data 是Lombok依賴的註解,使用它我們就不用寫get、set方法了

@Data
public class SysUser implements Serializable {
    private static final long serialVersionUID = 526934774547561999L;
    /**
     * 主鍵id
     */
    private Integer id;
    /**
     * 用戶名
     */
    private String username;
    /**
     * 用戶昵稱
     */
    private String nickname;
    /**
     * 用戶密碼
     */
    private String password;
    /**
     * 用戶性別
     */
    private String sex;
    /**
     * 用戶生日
     */
    private Date birthday;
    /**
     * 用戶郵箱
     */
    private String email;
    /**
     * 用戶電話
     */
    private String phone;
    /**
     * 用戶地址
     */
    private String addr;
    /**
     * 用戶啟用標誌
     */
    private String stopFlag;
    /**
     * 用戶創建時間
     */
    private Date createTime;
    /**
     * 用戶更新時間
     */
    private Date updateTime;

}

3.2 創建Mapper介面

數據訪問對象,是MVC架構中負責與資料庫進行交互的組件。它封裝了資料庫的訪問操作,提供給Service層調用。Dao層通常包含一系列方法,用於對資料庫進行增刪改查操作,以及與資料庫的連接、事務管理等。

@Mapper 表示這個介面是一個MyBatis的Mapper介面,用於定義資料庫操作的方法

@Mapper
public interface SysUserMapper {

    List<SysUser> querySyserList();
}

3.3 添加mybatis.xml文件

MyBatis的映射文件(mapper),用於操作資料庫中的sys_user表。其中定義了一個resultMap用於映射查詢結果到SysUser對象,還定義了一個select語句用於查詢sys_user表中的所有用戶信息。 id="querySyserList" 必須與mapper介面中方法名一致

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiezhr.mapper.SysUserMapper">
    <resultMap type="com.xiezhr.model.entity.SysUser" id="SysUserMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="username" column="username" jdbcType="VARCHAR"/>
        <result property="nickname" column="nickname" jdbcType="VARCHAR"/>
        <result property="password" column="password" jdbcType="VARCHAR"/>
        <result property="sex" column="sex" jdbcType="VARCHAR"/>
        <result property="birthday" column="birthday" jdbcType="TIMESTAMP"/>
        <result property="email" column="email" jdbcType="VARCHAR"/>
        <result property="phone" column="phone" jdbcType="VARCHAR"/>
        <result property="addr" column="addr" jdbcType="VARCHAR"/>
        <result property="stopFlag" column="stop_flag" jdbcType="VARCHAR"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <!--查詢所有用戶信息-->
    <select id="querySyserList" resultMap="SysUserMap">
        select * from sys_user
    </select>
</mapper>

3.4 新建service 介面及實現類

Service是MVC架構中負責處理業務邏輯的組件。它封裝了業務邏輯的實現細節,提供給Controller調用。Service層通常包含一系列方法,用於處理各種業務需求,如數據處理、事務管理、業務規則校驗等。

SysUserService

public interface SysUserService {
    List<SysUser> querySyserList();
}

SysUserServiceImpl

  • @Service :標識這個類是服務層(Service)的組件,用於實現業務邏輯的封裝和管理。以便Spring容器能夠掃描並將其實例化為一個Bean,並將其納入到Spring的管理中。通過@Service註解,可以方便地進行依賴註入、事務管理等操作
  • @Resource :標識一個類或對象需要被註入到另一個類中,用於實現依賴註入
@Service
public class SysUserServiceImpl implements SysUserService {

   @Resource
    private SysUserMapper  userMapper;
    @Override
    public List<SysUser> querySyserList() {
        return userMapper.querySyserList();
    }
}

3.5 創建Controller

Controller是MVC架構中負責接收用戶請求並處理的組件。它接收來自用戶的請求,並根據請求的內容調用相應的Service方法進行業務處理,然後返回結果給用戶。Controller通常負責路由請求、參數驗證、調用Service等操作

SysUserController

  • @RestController:用於標識一個類是RESTful風格的控制器,結合了@Controller和@ResponseBody註解的功能,用於處理HTTP請求並返回RESTful風格的響應
  • @RequestMapping:用於映射HTTP請求到控制器的處理方法,指定請求的URL路徑和請求方法
  • @Autowired:用於自動裝配依賴對象
@RestController
@RequestMapping("/sysUser")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    @RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
    public List<SysUser> querySysUser(){
       return sysUserService.querySyserList();
    }
}

到此我們三大組件的代碼都寫完了,接下來我們來看看我們寫好的介面

瀏覽器地址欄輸入:http://localhost:8080/sysUser/querySysUser

json數據返回

四、封裝統一結果返回

為了保證所有介面返回的數據格式一致,減少重覆代碼編寫。我們將對返回結果進行統一處理。

具體返回結果格式如下

{
  "code": 200, // 狀態碼,表示請求的處理結果
  "message": "請求成功", // 狀態消息,對請求結果的簡要描述
  "data": { // 數據對象,用於存儲具體的返回數據
    "key1": "value1",
    "key2": "value2"
  }
}
  • code :表示請求的處理結果,一般採用HTTP狀態碼或自定義的業務狀態碼
  • message :對請求結果的簡要描述,通常是一個字元串
  • data :用於存儲具體的返回數據,可以是一個對象、數組或其他類型的數據

4.1 定義 IResultCode 的介面

它位於 com.xiezhr.common.result 包中,可以由不同的類來實現,實現一致且統一的結果碼和消息的處理和返回

package com.xiezhr.common.result;

public interface IResultCode {
    String getCode();
    String getMsg();
}
  • getCode() : 這個方法返回一個 String 類型的結果碼
  • getMsg() : 這個方法返回一個 String 類型的結果消息

4.2 定義了一個枚舉類 ResultCode

定義了一個枚舉類 ResultCode ,它實現了 IResultCode 介面,並包含了一些常見的響應碼和對應的消息。

@AllArgsConstructor
@NoArgsConstructor
public enum ResultCode implements IResultCode, Serializable {
    SUCCESS("200","成功"),
    NOT_FOUND("404","未找到"),
    INTERNAL_SERVER_ERROR("500","伺服器內部錯誤"),    
    ;
    private String code;
    private String msg;
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getMsg() {
        return msg;
    }
}

定義系統中常見的響應碼和對應的消息,用於表示不同的業務場景或操作的執行結果

每個枚舉常量都包含一個 code 和一個 msg ,分別表示響應碼和消息內容

枚舉常量包括了一些常見的響應碼,如 SUCCESS 表示成功, INTERNAL_SERVER_ERROR 伺服器內部錯誤, NOT_FOUND 表示未找到

4.3 定義統一響應結構體

定義了一個名為 Result 的類,用於表示統一的響應結構體

@Data
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    private String code;
    private String msg;
    private T data;

    public static<T>  Result<T> success() {
        return success(null);
    }

    public static<T>  Result<T> success(T data) {
        Result result = new Result<>();
        result.setCode(ResultCode.SUCCESS.getCode());
        result.setMsg(ResultCode.SUCCESS.getMsg());
        result.setData(data);
        return result;
    }

    public static <T> Result<T> error(String msg) {
        Result<T> result = new Result<>();
        result.setCode(ResultCode.ERROR.getCode());
        result.setMsg(ResultCode.ERROR.getMsg());
        return result;
    }
}

到此,統一響應返回我們已經封裝好了,我們來改造一下Controller中的代碼看看效果

SysUserController未改之前

@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public List<SysUser> querySysUser(){
    return sysUserService.querySyserList();
}

SysUserController修改之後

@RequestMapping(value = "/querySysUser",method = RequestMethod.GET)
public Result querySysUser(){
    return Result.success(sysUserService.querySyserList());
}

前端返回結果

統一響應體返回

五、定義值對象VO

從上面的返回結果,我們會發現將密碼等敏感信息返回到了前端,這是非常不可取的

這時,我們就需要根據前端的需求,靈活地選擇需要展示的數據欄位

如果你還傻傻分不清PO BO VO DTO POJO DAO DO 這些概念,可以看看知乎的這篇文章,個人覺得還是說的比較清楚的了

https://www.zhihu.com/question/39651928/answer/2490565983

image-20230914224644771

5.1 定義VO

定義一個需要返回前端的VO

@Data
public class UserInfoVO {

    /**
     * 用戶名
     */
    private String username;
    /**
     * 用戶昵稱
     */
    private String nickname;

    /**
     * 用戶性別
     */
    private String sex;
    /**
     * 用戶生日
     */
    private Date birthday;
    /**
     * 用戶郵箱
     */
    private String email;
    /**
     * 用戶電話
     */
    private String phone;
    /**
     * 用戶地址
     */
    private String addr;
}

5.2 service 改造

interface SysUserService 改造前

public interface SysUserService {
    List<SysUser> querySyserList();
}

interface SysUserService 改造後

public interface SysUserService {
    List<UserInfoVO> querySyserList();
}

SysUserServiceImpl 改造前

@Service
public class SysUserServiceImpl implements SysUserService {

   @Resource
    private SysUserMapper  userMapper;
    @Override
    public List<SysUser> querySyserList() {
        return userMapper.querySyserList();
    }
}

SysUserServiceImpl改造後

@Service
public class SysUserServiceImpl implements SysUserService {

   @Resource
    private SysUserMapper  userMapper;
    @Override
    public List<UserInfoVO> querySyserList() {
        List<UserInfoVO> userInfoVOList = new ArrayList<UserInfoVO>();

        List<SysUser> sysUserList= userMapper.querySyserList();

        for (SysUser sysUser : sysUserList) {
            UserInfoVO userInfoVO = new UserInfoVO();
            BeanUtils.copyProperties(sysUser,userInfoVO);
            userInfoVOList.add(userInfoVO);
        }

        return userInfoVOList;
    }
}

service 返回由原來的SysUser -->變成UserInfoVO

5.3 介面測試

瀏覽器地址欄輸入:http://localhost:8080/sysUser/querySysUser

這時返回前端的json數據中已經沒有密碼了

介面測試

六、日期時間處理

認真看文章的小伙伴可能已經發現了,前面返回的json數據中,日期是 "birthday": "1999-09-18T16:00:00.000+00:00" 這樣的

這樣的日期可讀性非常差,有沒有什麼方法可以格式化下日期呢?

其實呢,日期格式化非常簡單,我們只需要在之前定義好的UserInfoVO 的日期屬性上加上一個註解即可

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;

我們來測試一下

通過格式化的日期就是我們習慣的日期格式了

日期顯示

七、統一異常處理

日常開發中,我們處理異常一般都會用到try-catchthrowthrows 的方式拋出異常。

這種方式不僅僅程式員處理麻煩,對用戶來說也不太友好

我們都希望不用寫過多的重覆代碼處理異常,又能提升用戶體驗。

這時候全局異常處理就顯得很便捷很重要了

小伙伴們如果對異常還不熟悉的可以看看這篇文章

https://blog.csdn.net/rong09_13/article/details/128090748

Springboot對於異常的處理也做了不錯的支持,它提供兩個註解供我們使用

  • @ControllerAdvice註解 :用來開啟全局的異常捕獲
  • @ExceptionHandler註解:說明捕獲哪些異常,對那些異常進行處理
@ControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(value =Exception.class)
	public String exceptionHandler(Exception e){
		System.out.println("發生了一個異常"+e);
       	return e.getMessage();
    }
}

7.1 添加自定義異常與其他異常返回結果

我們在Result 類中添加如下兩個方法來處理自定義異常和其他異常返回結果

//自定義異常返回的結果
public static <T> Result<T> bussinessErr(BusinessException e) {
    Result<T> result = new Result<>();
    result.setCode(e.getErrorCode());
    result.setMsg(e.getErrorMsg());
    result.setData(null);
    return result;
}
//其他異常處理方法返回的結果
public static <T> Result<T> otherErr(ResultCode resultCode) {
    Result<T> result = new Result<>();
    result.setCode(resultCode.getCode());
    result.setMsg(resultCode.getMsg());
    result.setData(null);
    return result;
}

7.2 自定義異常

新建com.xiezhr.exception包,並自定義異常類

public class BusinessException  extends RuntimeException{
    private String errorCode;
    private String errorMsg;

    public BusinessException() {

    }

    public BusinessException(String errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

}

7.3 全局異常處理

我們自定義一個全局異常處理類,來處理各種異常,包括自己定義的異常內部異常

這樣可以簡化不少代碼,不用自己對每個異常都使用try,catch的方式來實現

我們在com.xiezhr.exception 包下麵添加全局異常處理類GlobalExceptionHandler

@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 處理自定義異常
     *
     */
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public<T> Result<T> bizExceptionHandler(BusinessException e) {
        return Result.bussinessErr(e);
    }

    /**
     * 處理其他異常
     *
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Result exceptionHandler(Exception e) {
        return Result.otherErr(ResultCode.INTERNAL_SERVER_ERROR);
    }

}

7.4 測試異常處理

我們在SysUserController 中添加如下代碼來測試下異常,看看能不能捕獲到

@RequestMapping("/getBusinessException")
public Result DeException(){
    throw new BusinessException("400","我出錯了");
}
@RequestMapping("/getException")
public Result Exception(){
    Result result = new Result();
    int a=1/0;
    return result;
}

自定義異常捕獲返回

其他異常捕獲與返回

八、添加系統日誌

日誌記錄應用程式的運行狀態,通過日誌開發者可以更好的瞭解應用程式的運行情況

當系統出現bug時,也能通過日誌快速定位問題和解決問題

8.1 常用日誌框架

① 常用日誌框架

JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…

② 日誌框架之間的關係

日誌框架的設計類似於JDBC-資料庫驅動的設計,提供了統一的介面抽象層,然後再由各個資料庫廠商去實現它,

從而實現連接不同資料庫(Oracle、MySQL、PostgreSQL、MongoD...)

日誌門面(日誌抽象層) 日誌實現
JCL
SLF4j
jboss-logging
Log4j
JUL(java.util.logging)
Log4j2
Logback

我們需要需要選擇一個日誌門面 和日誌實現

springboot 預設選用SLF4jLogback

8.2 日誌常用配置

① 日誌輸出分析

預設日誌輸出

  • 日期時間:精確到毫秒
  • 日誌級別:TRACE|DEBUG|INFO|WARN|ERR
  • 進程ID:60236
  • 分隔符:預設以---進行分割
  • 線程名:由中括弧括起來,如[ main]
  • Logger名: 一般使用類名
  • 日誌內容

② 日誌級別

日誌級別由低到高如下

TRACE < DEBUG< INFO< WARN < ERROR

如果設置為 WARN ,則低於 WARN 的信息都不會輸出
Spring Boot中預設配置ERRORWARNINFO級別的日誌輸出到控制台

怎麼調整日誌級別呢?

  • 在application.properties或application.yml配置文件中 調整
logging.level.root=DEBUG
  • 在運行Spring Boot應用程式時,通過命令行參數來設置日誌級別
java -jar your-application.jar --logging.level.root=DEBUG

③ 日誌寫到文件中

需在application.properties或application.yml配置文件中設置logging.filelogging.path屬性

  • logging.file,設置文件,可以是絕對路徑,也可以是相對路徑。如:logging.file=my.log
  • logging.path,設置目錄,會在該目錄下創建spring.log文件,並寫入日誌內容,如:logging.path=/var/log

如果只配置 logging.file,會在項目的當前路徑下生成一個 xxx.log 日誌文件。
如果只配置 logging.path,在 /var/log文件夾生成一個日誌文件為 spring.log

:二者不能同時使用,如若同時使用,則只有logging.file生效

預設情況下,日誌文件的大小達到10MB時會切分一次,產生新的日誌文件,預設級別為:ERROR、WARN、INFO

8.3 日誌基本使用

①第一種方法

我們參照官網:https://www.slf4j.org/manual.html 的例子即可

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {

  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

②第二種方法

第一種方法中,每次使用都要創建了一個名為 logger 的Logger對象,使用起來有點繁瑣。這裡我們引入註解方式實現

使用註解@Slf4j 需要安裝lombok插件

可以用{} 占位符來拼接字元串,而不需要使用+來連接字元串。

@SpringBootTest
@Slf4j
class SpringbootdemoApplicationTests {

    @Test
    void testLog() {
        String name = "xiezhr";
        int age = 20;
        log.info("name:{},age:{}", name, age);
    }

}

日誌輸出如下:

2023-09-16T12:27:57.014+08:00  INFO 53792 --- [           main] c.x.s.SpringbootdemoApplicationTests     : name:xiezhr,age:20

8.4 日誌高級配置

前面幾節說的都是springboot基本日誌配置,如果這些都不能滿足我們的需求,我們就需要添加logback-spring.xml 官方推薦的配置文件進行配置

logback-spring.xml 中 配置了兩個 分別是①輸出到控制台②將日誌寫到文件中 並且使用 指定開發/生產環境配置

大家可以參考下麵配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日誌級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低於WARN的信息都不會輸出 -->
<configuration>

    <!-- SpringBoot預設logback的配置 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
    <property name="LOG_HOME" value="/logs/${APP_NAME}"/>

    <!--1. 輸出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- <withJansi>true</withJansi>-->
        <!--此日誌appender是為開發使用,只配置最低級別,控制台輸出的日誌級別是大於或等於此級別的日誌信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 2. 輸出到文件  -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 當前記錄的日誌文檔完整路徑 -->
        <file>${LOG_HOME}/log.log</file>
        <!--日誌文檔輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} -%5level ---[%15.15thread] %-40.40logger{39} : %msg%n%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設置字元集 -->
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日誌文檔保留天數-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 臨界值過濾器,輸出大於INFO級別日誌 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- 開發環境輸出至控制台 -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>

    <!-- 生產環境輸出至文件 -->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>
</configuration>

看到這,大家如果對日誌還不太清楚的可以看看下麵雷神講的視頻,

https://www.bilibili.com/video/BV1sb411H7Po

最終完整項目結構如下

完成項目結構

九、小結

本篇文章我們手把手創建了一個SpringBoot項目,並整合Mybatis實現了將資料庫中數據通過json返回前端。

對返回json結果進行統一封裝,異常的統一處理,日期時間的處理、開發/生產環境配置以及系統日誌配置。

以上都是基於日常工作開發中的實際案例,希望對你有所幫助。

本期內容到此九結束了,希望對你有所幫助。我們下期再見~ (●'◡'●)

本文來自博客園,作者:xiezhr,轉載請註明原文鏈接:https://www.cnblogs.com/xiezhr/p/17708711.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相比用戶停留時間短、用完即走的 Web 頁面,桌面 QQ 用戶在一次登錄後,可能會掛機一周以上,這段期間,如果沒有嚴格控制好 QQ 記憶體占用,那麼結果可能是用戶交互響應變慢、甚至 Crash。在系統監控工具里,高記憶體占用也會被直觀地反映出來,帶來不好的口碑。MAC QQ 灰度期間,也聽到了一些用戶關... ...
  • 介紹 ESLint 是一個根據方案識別並報告 ECMAScript/JavaScript 代碼問題的工具,其目的是使代碼風格更加一致並避免錯誤。在很多地方它都與 JSLint 和 JSHint 類似,除了: ESLint 使用 Espree 對 JavaScript 進行解析。 ESLint 在代碼 ...
  • 這是一個講解DDD落地的文章系列,作者是《實現領域驅動設計》的譯者滕雲。本文章系列以一個真實的並已成功上線的軟體項目——碼如雲(https://www.mryqr.com)為例,系統性地講解DDD在落地實施過程中的各種典型實踐,以及在面臨實際業務場景時的諸多取捨。 本系列包含以下文章: DDD入門 ...
  • 系統設計之緩存五種策略 當我們在架構中引入緩存時,緩存和資料庫之間的同步就變得不可避免。 讓我們看看如何保持數據同步的五種常見策略。 1)閱讀策略: 緩存在一邊 通讀2)寫策略:寫周圍 回信 寫通緩存策略經常組合使用。例如,write-around 通常與 cache-aside 一起使用,以確保緩 ...
  • 前一篇水文中,老周演示了 QAbstractItemModel 抽象類的繼承方法。其實,在 Qt 的庫裡面,QAbstractItemModel 類也派生了兩個基類,能讓開發者繼承起來【稍稍】輕鬆一些。 這兩個類是 QAbstractListModel 和 QAbstractTableModel。 ...
  • 註釋可以用來解釋Python代碼。註釋可以用來使代碼更易讀。註釋可以用來在測試代碼時防止執行。 創建註釋 註釋以#開始,Python會忽略它們: 示例:獲取您自己的Python註釋 # 這是一個註釋 print("Hello, World!") 註釋可以放在一行的末尾,Python會忽略行的其餘部分 ...
  • 目錄 線程簡介 線程實現(重點) 線程狀態 線程同步(重點) 線程通信問題 線程實現: 方式一:繼承Thread類 /** * TODO * @author 清蓮孤舟 * @CreateDate 2023/9/17/9:28 * 創建線程的方式一:通過繼承Thread類實現 */ //繼承Threa ...
  • 什麼是 Prometheus Prometheus 是一個開源的系統監控和警報工具,最初由 SoundCloud 開發,並於 2012 年發佈為開源項目。它是一個非常強大和靈活的工具,用於監控應用程式和系統的性能,並根據預定義的規則觸發警報。以下是對 Prometheus 的詳細介紹: 特點和優勢: ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...