使用IDEA創(chuàng)建SpringBoot項目
1、使用SpringBoot腳手架創(chuàng)建
我們使用SpringBoot的腳手架Spring Initializr創(chuàng)建,如圖所示:
2、選擇SpringBoot版本
最開始做項目時候,組長說創(chuàng)建一個 springboot 2.5.4 的項目,mysql使用 5.6.X ,maven使用是3.6.X。其實最開始我也沒有多想,直接照做了,但是后面回想自己平時看到的SpringBoot開源代碼,有的是使用的是2.5.X,有的是使用2.6.X,還有的是使用2.7.X版本的,除了3以上版本在實際開發(fā)中沒有見過,目前2版本的見到的太多版本號不一樣的了。難道只要是2版本,都可以隨意使用?當(dāng)然我們知道不同的版本肯定是有差異的,每個版本都存在一些bug,后面的版本會對前一個版本進(jìn)行修護(hù)和升級,也有一些方法,規(guī)則的調(diào)整。
所以說,如果要是一個人開發(fā),只要你不用到每個框架版本的新特性,使用一些常規(guī)的操作,其實也不用太關(guān)注版本,但是實際情況是,往往后端不是你一個人在開發(fā),要是每個人版本都不一樣,萬一出現(xiàn)了什么bug,排查起來也會比統(tǒng)一版本的情況下排查減少很多不必要的麻煩。所以開發(fā)中項目指定版本這里存在兩個目的,一個是:統(tǒng)一版本,方便管理(跟每家公司有自己的代碼規(guī)約一樣,遵守就行了),第二個目的,降低風(fēng)險,不使用版本太高的框架,且往往使用常用的框架版本進(jìn)行開發(fā),開發(fā)環(huán)境也比較熟悉。當(dāng)然最后還有一個,多看看官網(wǎng),多了解一些框架的不同版本特性,也有助于自己開發(fā)。
2.1 推薦選擇2.7.x版本開發(fā)
spring2.X版本在2023年11月24日停止維護(hù)了,因此創(chuàng)建spring項目時不再有2.X版本的選項,只能從3.1.X版本開始選擇而Spring3.X版本不支持JDK8,JDK11,最低支持JDK17,因此JDK8也無法選擇了,如圖所示:
當(dāng)然,停止維護(hù)只代表我們無法用idea主動創(chuàng)建spring2.X版本的項目了,不代表我們無法使用。目前阿里云還是支持創(chuàng)建Spring2.X版本的項目的,修改Server URL為https://start.aliyun.com,如圖所示:
現(xiàn)在可以創(chuàng)建項目了,如圖所示:
點擊Next,建議選擇2.7.x版本,并且根據(jù)項目需求添加依賴如圖所示:
常用的依賴說明一下:
- Lombok : 需要我們先安裝Lombok插件,可以簡化實體類書寫;
- String Web:添加項目的web支持,比如內(nèi)置的Tomcat等;
- MySQL Driver:我們用到MySQL數(shù)據(jù)庫,所以添加MySQL相關(guān)驅(qū)動
- MyBatis Framework:我們用到MyBatis這一ORM框架操作數(shù)據(jù)庫;
- JDBC API:Spring對JDBC的封裝,如JdbcTemplate。
至此,簡單的SpringBoot項目算創(chuàng)建完成了。
3、配置項目并啟動項目
3.1 創(chuàng)建項目結(jié)構(gòu)
1、創(chuàng)建配置文件
項目剛創(chuàng)建完成時,默認(rèn)的配置文件是application.properties文件,當(dāng)然我們也可以創(chuàng)建application.yml文件。如果在yml文件中沒有輸入提示,需要到設(shè)置File Types中檢查是否設(shè)置了ymal文件,如圖所示:
2、創(chuàng)建項目結(jié)構(gòu)
3、配置maven
在這里配置本地Maven本地路徑、Maven倉庫。在本地Maven的settings.xml中會配置maven的鏡像資源等信息。
4、檢查pom.xml文件
特別強調(diào),檢查一下pom.xml的<build>中的<skip>是否為true,有些情況會默認(rèn)為true。我們需要將其設(shè)置為<skip>false</skip>,或者去掉該標(biāo)簽,否則在打包的時候會沒有程序的入口類mainClass,然后導(dǎo)致無法啟動程序:
4、 下載相關(guān)依賴
在這里我們下載之前配置好的依賴,一般項目創(chuàng)建后會默認(rèn)下載
5、 配置基礎(chǔ)內(nèi)容
在配置文件中配置一些基本的內(nèi)容:
server: port: 8080 # 端口號 servlet: context-path: /myspringboot001 #項目根路徑(前面必須加/) spring: # 項目名稱 application: name: my-spring-boot001 # Mysql配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3307/my-springboot-001?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 username: root password: root1998 # Mybatis配置 mybatis: mapper-locations: classpath:mappers/*.xml #指定Mybatis的Mapper文件 type-aliases-package: com.example.myspringboot001.*.entity #指定Mybatis的實體目錄
6、 配置Mybatis包掃描路徑
我們在啟動類上配置Mybatis的包掃描路徑,用注解@MapperScan:
@SpringBootApplication @MapperScan(value = {"com.example.myspringboot001.**.mapper"}) public class MySpringboot001Application { public static void main(String[] args) { SpringApplication.run(MySpringboot001Application.class, args); } }
以上配置好之后,我們就可以啟動springboot項目。瀏覽器輸入:http://localhost:8080/myspringboot001/ 后出現(xiàn)如下內(nèi)容,說明項目啟動成功,如圖所示:
4、配置多環(huán)境
在實際開發(fā)中,我們一般都會有好幾套運行環(huán)境。比如開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境等等
我們不可能每次都去修改一個配置文件,這就顯得很麻煩。下面我們主要說一說怎么配置多環(huán)境。
1、 修改application.yml配置文件
spring: # 項目名稱 application: name: my-spring-boot001 # 當(dāng)前配置文件 profiles: active: dev
2、創(chuàng)建多環(huán)境配置文件
上面的配置,項目在啟動的時候就會加載application.yml(主)和application-dev.yml(副)配置文件。
注意:如果主配置文件和副配置文件的配置項沖突的時候,會優(yōu)先使用副配置文件的配置項。
5、連接數(shù)據(jù)庫查詢數(shù)據(jù)
5.1 新建數(shù)據(jù)庫my-springboot-001并且創(chuàng)建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 '用戶啟用標(biāo)志', `create_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '用戶創(chuàng)建時間', `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', 'xiezhr@qq.com', '13288888888', '云南省昆明市', '0', '2023-09-04 21:08:32', NULL); INSERT INTO `sys_user` VALUES (2, 'xiaoqi', '程序員曉柒', '123456', '1', '2020-10-04', 'xiaoqi@163.com', '13288888888', '云南文山', '0', '2023-09-04 21:09:42', NULL); INSERT INTO `sys_user` VALUES (3, 'xiaodeng', '財務(wù)小鄧', '123456', '2', '2019-09-04', 'xiaodeng@qq.com', '13588888888', '云南文山', '0', '2023-09-04 21:10:43', NULL);
執(zhí)行結(jié)果如圖所示:
5.2 創(chuàng)建實體類
@Data public class SysUser implements Serializable { private static final long serialVersionUID = 123456789L; /** * 主鍵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; /** * 用戶啟用標(biāo)志 */ private String stopFlag; /** * 用戶創(chuàng)建時間 */ private Date createTime; /** * 用戶更新時間 */ private Date updateTime; }
5.3 創(chuàng)建Mapper接口
數(shù)據(jù)訪問對象,是MVC架構(gòu)中負(fù)責(zé)與數(shù)據(jù)庫進(jìn)行交互的組件。它封裝了數(shù)據(jù)庫的訪問操作,提供給Service層調(diào)用。Dao層通常包含一系列方法,用于對數(shù)據(jù)庫進(jìn)行增刪改查操作,以及與數(shù)據(jù)庫的連接、事務(wù)管理等。@Mapper表示這個接口是一個MyBatis的Mapper接口,用于定義數(shù)據(jù)庫操作的方法。
@Mapper public interface SysUserMapper { /** * 查詢所有用戶信息 * @return 所有用戶信息 */ List<SysUser> querySysUserList(); }
5.4 創(chuàng)建Mybatis的xml文件
MyBatis的映射文件(mapper),用于操作數(shù)據(jù)庫中的sys_user表。其中定義了一個resultMap用于映射查詢結(jié)果到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.example.myspringboot001.system.mapper.SysUserMapper"> <resultMap type="com.example.myspringboot001.system.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="querySysUserList" resultMap="SysUserMap"> select * from sys_user </select> </mapper>
這里需要注意的是,IDEA在創(chuàng)建Mybatis的Mapper XML文件時,是沒有頭部信息,往往我們需要去復(fù)制過來,這就會很麻煩,我們可以自定義Mybatis Mapper XML文件模板,這樣我們創(chuàng)建Mapper XML時就會有頭部信息了如圖所示:
然后我們在新建文件時選擇Mybatis Mapper XML就可以了,如圖:
5.5 創(chuàng)建Service接口及實現(xiàn)類
Service是MVC架構(gòu)中負(fù)責(zé)處理業(yè)務(wù)邏輯的組件。它封裝了業(yè)務(wù)邏輯的實現(xiàn)細(xì)節(jié),提供給Controller調(diào)用。Service層通常包含一系列方法,用于處理各種業(yè)務(wù)需求,如數(shù)據(jù)處理、事務(wù)管理、業(yè)務(wù)規(guī)則校驗等。
1、創(chuàng)建SysUserService接口
public interface SysUserService { /** * 查詢所有用戶信息 * @return 所有用戶信息 */ List<SysUser> querySysUserList(); }
2、創(chuàng)建SysUserServiceImpl實現(xiàn)類
@Service public class SysUserServiceImpl implements SysUserService { @Resource private SysUserMapper userMapper; @Override public List<SysUser> querySysUserList() { return userMapper.querySysUserList(); } }
5.6 創(chuàng)建Controller
Controller是MVC架構(gòu)中負(fù)責(zé)接收用戶請求并處理的組件。它接收來自用戶的請求,并根據(jù)請求的內(nèi)容調(diào)用相應(yīng)的Service方法進(jìn)行業(yè)務(wù)處理,然后返回結(jié)果給用戶。Controller通常負(fù)責(zé)路由請求、參數(shù)驗證、調(diào)用Service等操作。
1、創(chuàng)建SysUserController
@RestController @RequestMapping("/sysUser") public class SysUserController { @Autowired private SysUserService sysUserService; /** * 查詢所有用戶信息 * @return */ @RequestMapping(value = "/querySysUser",method = RequestMethod.GET) public List<SysUser> querySysUser(){ return sysUserService.querySysUserList(); } }
到此我們?nèi)蠼M件的代碼都寫完了,接下來我們來看看我們寫好的接口,PostMan地址欄輸入:http://localhost:8080/myspringboot001/sysUser/querySysUser,如圖所示:
我們可以看到返回的時間格式是"2020-10-03T16:00:00.000+00:00"這樣的,可讀性很差。其實呢,日期格式化非常簡單,我們只需要在之前定義好的實體類SysUser的日期屬性上加上一個注解**@JsonFormat**即可:
import com.fasterxml.jackson.annotation.JsonFormat; @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday;
我們來測試一下,通過格式化的日期就是我們習(xí)慣的日期格式了,如圖所示:
6、封裝統(tǒng)一結(jié)果返回
為了保證所有接口返回的數(shù)據(jù)格式一致,減少重復(fù)代碼編寫。我們將對返回結(jié)果進(jìn)行統(tǒng)一處理。
具體返回結(jié)果格式如下:
{ "code": 200, // 狀態(tài)碼,表示請求的處理結(jié)果 "message": "請求成功", // 狀態(tài)消息,對請求結(jié)果的簡要描述 "data": { // 數(shù)據(jù)對象,用于存儲具體的返回數(shù)據(jù) "key1": "value1", "key2": "value2" } }
- code :表示請求的處理結(jié)果,一般采用HTTP狀態(tài)碼或自定義的業(yè)務(wù)狀態(tài)碼
- message :對請求結(jié)果的簡要描述,通常是一個字符串
- data :用于存儲具體的返回數(shù)據(jù),可以是一個對象、數(shù)組或其他類型的數(shù)據(jù)
6.1 定義 IResultCode 的接口
它位于com.example.myspringboot001.common包中,可以由不同的類來實現(xiàn),實現(xiàn)一致且統(tǒng)一的結(jié)果碼和消息的處理和返回:
public interface IResultCode { /** * 獲取狀態(tài)碼 * @return 狀態(tài)碼 */ String getCode(); /** * 獲取狀態(tài)信息 * @return 狀態(tài)信息 */ String getMsg(); }
6.2 定義了一個枚舉類 ResultCode
定義了一個枚舉類 ResultCode ,它實現(xiàn)了 IResultCode 接口,并包含了一些常見的響應(yīng)碼和對應(yīng)的消息:
public enum ResultCode implements IResultCode, Serializable { SUCCESS("200","成功"), NOT_FOUND("404","未找到"), INTERNAL_SERVER_ERROR("500","服務(wù)器內(nèi)部錯誤"); private String code; private String msg; ResultCode(String code, String msg){ this.code = code; this.msg = msg; } @Override public String getCode() { return code; } @Override public String getMsg() { return msg; } }
定義系統(tǒng)中常見的響應(yīng)碼和對應(yīng)的消息,用于表示不同的業(yè)務(wù)場景或操作的執(zhí)行結(jié)果每個枚舉常量都包含一個 code 和一個 msg ,分別表示響應(yīng)碼和消息內(nèi)容枚舉常量包括了一些常見的響應(yīng)碼,如 SUCCESS 表示成功, INTERNAL_SERVER_ERROR 服務(wù)器內(nèi)部錯誤, NOT_FOUND 表示未找到。
6.3 定義統(tǒng)一響應(yīng)結(jié)構(gòu)體
定義了一個名為 Result 的類,用于表示統(tǒng)一的響應(yīng)結(jié)構(gòu)體:
@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; } }
到此,統(tǒng)一響應(yīng)返回我們已經(jīng)封裝好了,我們來改造一下Controller中的代碼看看效果。
1、SysUserController未改之前:
@RequestMapping(value = "/querySysUser",method = RequestMethod.GET) public List<SysUser> querySysUser(){ return sysUserService.querySysUserList(); }
2、SysUserController未改之后:
@RequestMapping(value = "/querySysUser",method = RequestMethod.GET) public Result querySysUser(){ return Result.success(sysUserService.querySysUserList()); }
再次測試返回的數(shù)據(jù):
7、定義視圖對象VO
從上面的返回結(jié)果,我們會發(fā)現(xiàn)將密碼等敏感信息返回到了前端,這是非常不可取的這時,我們就需要根據(jù)前端的需求,靈活地選擇需要展示的數(shù)據(jù)字段。
7.1 定義VO
定義一個需要返回前端的VO
@Data public class SysUserVo { /** * 用戶名 */ private String username; /** * 用戶昵稱 */ private String nickname; /** * 用戶性別 */ private String sex; /** * 用戶生日 */ @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday; /** * 用戶郵箱 */ private String email; /** * 用戶電話 */ private String phone; /** * 用戶地址 */ private String addr; }
7.2 service改造
SysUserService改造前
/** * 查詢所有用戶信息 * @return 所有用戶信息 */ List<SysUser> querySysUserList();
SysUserServiceImpl改造前
@Override public List<SysUser> querySysUserList() { System.out.println(sysUserMapper); return sysUserMapper.querySysUserList(); }
SysUserService改造后
/** * 查詢所有用戶信息 * @return 所有用戶信息 */ List<SysUserVo> querySysUserList();
SysUserServiceImpl改造后
@Override public List<SysUserVo> querySysUserList() { List<SysUserVo> sysUserVos = new ArrayList<>(); List<SysUser> sysUsers = sysUserMapper.querySysUserList(); // 將po的值復(fù)制到vo中 sysUsers.forEach(sysUser -> { SysUserVo vo = new SysUserVo(); BeanUtils.copyProperties(sysUser, vo); sysUserVos.add(vo); }); return sysUserVos; }
我們再次用postman測試,輸入http://localhost:8080/myspringboot001/sysUser/querySysUser,結(jié)果如圖所示:
8、統(tǒng)一異常處理
日常開發(fā)中,我們處理異常一般都會用到try-catch 、throw和throws 的方式拋出異常。這種方式不僅僅程序員處理麻煩,對用戶來說也不太友好我們都希望不用寫過多的重復(fù)代碼處理異常,又能提升用戶體驗。這時候全局異常處理就顯得很便捷很重要了。
Springboot對于異常的處理也做了不錯的支持,它提供兩個注解供我們使用。
- @ControllerAdvice注解 :用來開啟全局的異常捕獲,
- @ExceptionHandler注解:說明捕獲哪些異常,對那些異常進(jìn)行處理
8.1 添加自定義異常與其他異常返回結(jié)果
我們在Result 類中添加如下兩個方法來處理自定義異常和其他異常返回結(jié)果:
//自定義異常返回的結(jié)果 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; } //其他異常處理方法返回的結(jié)果 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; }
8.2 自定義異常類
在com.example.myspringboot001.common.exception包中新建BusinessException異常類:
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; } }
8.3 全局異常處理
我們自定義一個全局異常處理類,來處理各種異常,包括自己定義的異常和內(nèi)部異常 。這樣可以簡化不少代碼,不用自己對每個異常都使用try,catch的方式來實現(xiàn)。
在com.example.myspringboot001.common.handler包中新建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.ERROR); } }
8.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; }
9、 添加系統(tǒng)日志
日志記錄應(yīng)用程序的運行狀態(tài),通過日志開發(fā)者可以更好的了解應(yīng)用程序的運行情況當(dāng)系統(tǒng)出現(xiàn)bug時,也能通過日志快速定位問題和解決問題。
9.1 常用日志框架
我們需要需要選擇一個日志門面 和日志實現(xiàn),Spring Boot默認(rèn)集成了SLF4j 和Logback作為日志實現(xiàn)框架。如果您使用Maven構(gòu)建項目,通常無需手動添加Logback依賴,因為Spring Boot的起步依賴(starter dependencies)中已經(jīng)包含了它。
9.2 日志常用配置
1、日志輸出分析,如圖所示:
- 日期時間:精確到毫秒
- 日志級別:TRACE | DEBUG | INFO | WARN | ERR
- 進(jìn)程ID:60236
- 分隔符:默認(rèn)以—進(jìn)行分割
- 線程名:由中括號括起來,如[ main]
- Logger名: 一般使用類全限定名
- 日志內(nèi)容
2、日志級別
日志級別由低到高如下
TRACE < DEBUG< INFO< WARN < ERROR
如果設(shè)置為 WARN ,則低于 WARN 的信息都不會輸出 Spring Boot中默認(rèn)配置是INFO級別。
3、調(diào)整日志級別
可以在配置文件application.yml中設(shè)置:
logging.level.root=DEBUG
或者在運行Spring Boot應(yīng)用程序時,通過命令行參數(shù)來設(shè)置日志級別
java -jar your-application.jar --logging.level.root=DEBUG
4、日志寫到文件中
需在application.properties或application.yml配置文件中設(shè)置logging.file.path或logging.file.name屬性。
logging: file: path: /myspringboot/log # 只能指定路徑,文件名默認(rèn)為 spring.log,這里相當(dāng)于window的 E:\myspringboot\log\spring.log #name: /myspringboot/log/my.log # 可以指定文件路徑和文件名,這里相當(dāng)于window的 E:\myspringboot\log\my.log #name: my.log 使用相對路徑,這里相當(dāng)于window的 E:\WorkPlace\IDEA\my-springboot-001\my.log
注意:logging.file.path和logging.file.name只能生效一個,在配置了兩者的情況下,以logging.file.name的配置為準(zhǔn)。
9.3 日志的基本使用
1、使用官方例子
Logger logger = LoggerFactory.getLogger(SysUserController.class); @Autowired private SysUserService sysUserService; /** * 查詢所有用戶信息 * @return */ @RequestMapping(value = "/querySysUser",method = RequestMethod.GET) public Result querySysUser(){ String name = "tanya"; logger.info("this name is {}", name); return Result.success(sysUserService.querySysUserList()); }
2、使用lombok插件
第一種方法中,每次使用都要創(chuàng)建了一個名為 logger 的Logger對象,使用起來有點繁瑣。這里我們引入注解方式實現(xiàn)。使用注解**@Slf4j** 需要安裝lombok插件。
@Slf4j public class SysUserController { @Autowired private SysUserService sysUserService; /** * 查詢所有用戶信息 * @return */ @RequestMapping(value = "/querySysUser",method = RequestMethod.GET) public Result querySysUser(){ log.info("this name is {}", name); return Result.success(sysUserService.querySysUserList()); } }
可以用{} 占位符來拼接字符串,而不需要使用+來連接字符串。
9.4 日志高級配置
前面幾節(jié)說的都是springboot基本日志配置,如果這些都不能滿足我們的需求,我們就需要添加logback-spring.xml 官方推薦的配置文件進(jìn)行配置。
注意:如果同時存在logback.xml和logback-spring.xml,Spring Boot 將會優(yōu)先選擇 logback-spring.xml 作為日志配置。logback.xml多用于非springboot項目;logback-spring.xml只能用于springboot項目,即帶有@SpringBootApplication啟動程序中才生效,在main或者Junit中依然不生效。并且這兩個文件的配置項優(yōu)先于application.yml的日志配置。
logback-spring.xml 中 配置了兩個 分別是
- 輸出到控制臺
- 將日志寫到文件中
- 使用 指定開發(fā)/生產(chǎn)環(huán)境配置
參考如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會輸出 --> <configuration> <!-- SpringBoot默認(rèn)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是為開發(fā)使用,只配置最低級別,控制臺輸出的日志級別是大于或等于此級別的日志信息--> <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"> <!-- 當(dāng)前記錄的日志文檔完整路徑 --> <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> <!-- 此處設(shè)置字符集 --> </encoder> <!-- 日志記錄器的滾動策略,按日期,按大小記錄 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!--這里是超出大小后新建的文件名,并且保存的是分割前面的舊日志,新日志還是在log.log中--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>5KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!--日志文檔保留天數(shù)--> <maxHistory>15</maxHistory> </rollingPolicy> <!-- 臨界值過濾器,輸出大于INFO級別日志 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> </appender> <!-- 開發(fā)環(huán)境輸出至控制臺和文件 --> <springProfile name="dev"> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> </springProfile> <!-- 生產(chǎn)環(huán)境輸出至控制臺和文件 --> <springProfile name="prod"> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> </springProfile> </configuration>
最終完整的項目結(jié)構(gòu)如下:
到此這篇關(guān)于使用IDEA創(chuàng)建SpringBoot項目的文章就介紹到這了,更多相關(guān)IDEA創(chuàng)建SpringBoot項目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Mybatis-plus自定義SQL注入器查詢@TableLogic邏輯刪除后的數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-03-03SpringBoot自定義starter啟動器的實現(xiàn)思路
這篇文章主要介紹了SpringBoot如何自定義starter啟動器,通過starter的自定義過程,能夠加深大家對SpringBoot自動配置原理的理解,需要的朋友可以參考下2022-10-10詳解Java中l(wèi)ist,set,map的遍歷與增強for循環(huán)
這篇文章主要介紹了詳解Java中l(wèi)ist,set,map的遍歷與增強for循環(huán)的相關(guān)資料,需要的朋友可以參考下2017-02-02