
??????教程全知識點簡介:學(xué)習(xí)目標(biāo) 一、Spring簡介 2 初識Spring 3 Spring體系結(jié)構(gòu) 二、IOC和DI入門案例【重點】 五、Bean的生命周期【了解】 問題導(dǎo)入 1 生命周期相關(guān)概念介紹 2 代碼演示 3 Bean銷毀時機(jī) 六、依賴注入(DI配置) 1 依賴注入方式【重點】 2 依賴自動裝配【理解】 3 集合注入 今日目標(biāo) 一、第三方資源配置管理 1 管理DataSource連接池對象 2 加載properties屬性文件【重點】 四、Spring整合其他技術(shù)【重點】 二、AOP案例 1 案例-測量業(yè)務(wù)層接口萬次執(zhí)行效率 2 AOP切入點數(shù)據(jù)獲取 2 Spring事務(wù)角色【理解】 二、請求與響應(yīng) 1 請求映射路徑【重點】 2 請求參數(shù) 3 日期類型參數(shù)傳遞【重點】 4 響應(yīng) 三、REST風(fēng)格 1 REST簡介 2 RESTful入門案例 3 REST快速開發(fā)【重點】 今日內(nèi)容 一、SSM整合【重點】 1 SSM整合配置 三、異常處理器【理解】 1 異常介紹 2 異常處理器 一、分模塊開發(fā)與設(shè)計 1. 分模塊開發(fā)的意義 模塊拆分原則 2. 分模塊開發(fā)(模塊拆分) 二、依賴管理 1. 依賴傳遞 2. 可選依賴 4 可選依賴和排除依賴的區(qū)別 三、聚合與繼承 1. 聚合工程 3. 繼承關(guān)系 5. 聚合與繼承的區(qū)別 四、屬性管理 1. 屬性 2. 版本管理 五、多環(huán)境配置與應(yīng)用 1. 多環(huán)境配置作用 2. 跳過測試(了解) 六、私服 2. 私服倉庫分類 3. 資源上傳與下載 附件1:POM文件總體配置說明 一、MyBatisPlus簡介 1. 入門案例 二、標(biāo)準(zhǔn)數(shù)據(jù)層開發(fā) 2. Lombok插件介紹 四、DML編程控制 1. id生成策略控制(Insert) 2. 多記錄操作(批量Delete/Select) 3. 邏輯刪除(Delete/Update) 4. 樂觀鎖(Update)

????倉庫code.zip ??直接-->:???https://gitlab.com/yiqing112/backend/-/blob/main/Java/Java熱門框架深入開發(fā)/note.md ???????
? 本教程項目亮點
?? 知識體系完整:覆蓋從基礎(chǔ)原理、核心方法到高階應(yīng)用的全流程內(nèi)容
?? 全技術(shù)鏈覆蓋:完整前后端技術(shù)棧,涵蓋開發(fā)必備技能
?? 從零到實戰(zhàn):適合 0 基礎(chǔ)入門到提升,循序漸進(jìn)掌握核心能力
?? 豐富文檔與代碼示例:涵蓋多種場景,可運行、可復(fù)用
?? 工作與學(xué)習(xí)雙參考:不僅適合系統(tǒng)化學(xué)習(xí),更可作為日常開發(fā)中的查閱手冊
?? 模塊化知識結(jié)構(gòu):按知識點分章節(jié),便于快速定位和復(fù)習(xí)
?? 長期可用的技術(shù)積累:不止一次學(xué)習(xí),而是能伴隨工作與項目長期參考
??????全教程總章節(jié)


??????本篇主要內(nèi)容
三、異常處理器【理解】
問題導(dǎo)入
問題1:項目各個個層級均可能出現(xiàn)異常,異常處理代碼書寫在哪一層?
1 異常介紹
- 程序開發(fā)過程中不可避免的會遇到異?,F(xiàn)象, 不能讓用戶看到這樣的頁面數(shù)據(jù)

- 出現(xiàn)異?,F(xiàn)象的常見位置與常見誘因如下:
- 框架內(nèi)部拋出的異常:因使用不合規(guī)導(dǎo)致
- 數(shù)據(jù)層拋出的異常:因外部服務(wù)器故障導(dǎo)致(例如:服務(wù)器訪問超時)
- 業(yè)務(wù)層拋出的異常:因業(yè)務(wù)邏輯書寫錯誤導(dǎo)致(例如:遍歷業(yè)務(wù)書寫操作,導(dǎo)致索引異常等)
- 表現(xiàn)層拋出的異常:因數(shù)據(jù)收集、校驗等規(guī)則導(dǎo)致(例如:不匹配的數(shù)據(jù)類型間導(dǎo)致異常)
- 工具類拋出的異常:因工具類書寫不嚴(yán)謹(jǐn)不夠健壯導(dǎo)致(例如:必要釋放的連接長期未釋放等)
2 異常處理器
2.2.1 編寫異常處理器
@RestControllerAdvice //用于標(biāo)識當(dāng)前類為REST風(fēng)格對應(yīng)的異常處理器
public class ProjectExceptionAdvice {
//統(tǒng)一處理所有的Exception異常
@ExceptionHandler(Exception.class)
public Result doOtherException(Exception ex){
return new Result(666,null);
}
}
使用異常處理器之后的效果

2.2.2 @RestControllerAdvice注解介紹
名稱:@RestControllerAdvice
類型:==類注解==
位置:Rest風(fēng)格開發(fā)的控制器增強類定義上方
作用:為Rest風(fēng)格開發(fā)的控制器類做增強
說明:此注解自帶@ResponseBody注解與@Component注解,具備對應(yīng)的功能
2.2.3 @ExceptionHandler注解介紹
- 名稱:@ExceptionHandler
- 類型:==方法注解==
- 位置:專用于異常處理的控制器方法上方
- 作用:設(shè)置指定異常的處理方案,功能等同于控制器方法,出現(xiàn)異常后終止原始控制器執(zhí)行,并轉(zhuǎn)入當(dāng)前方法執(zhí)行
- 說明:此類方法可以根據(jù)處理的異常不同,制作多個方法分別處理對應(yīng)的異常
四、項目異常處理方案【理解】
問題導(dǎo)入
請說出項目當(dāng)前異常的分類以及對應(yīng)類型異常該如何處理?
1 項目異常分類
- 業(yè)務(wù)異常(BusinessException)
- 規(guī)范的用戶行為產(chǎn)生的異常
- 不規(guī)范的用戶行為操作產(chǎn)生的異常
- 系統(tǒng)異常(SystemException)
- 項目運行過程中可預(yù)計且無法避免的異常
- 其他異常(Exception)
- 編程人員未預(yù)期到的異常
2 項目異常處理方案
- 業(yè)務(wù)異常(BusinessException)
- ==發(fā)送對應(yīng)消息傳遞給用戶,提醒規(guī)范操作==
- 系統(tǒng)異常(SystemException)
- ==發(fā)送固定消息傳遞給用戶,安撫用戶==
- 發(fā)送特定消息給運維人員,提醒維護(hù)
- 記錄日志
- 其他異常(Exception)
- ==發(fā)送固定消息傳遞給用戶,安撫用戶==
- 發(fā)送特定消息給編程人員,提醒維護(hù)(納入預(yù)期范圍內(nèi))
- 記錄日志
3 項目異常處理代碼實現(xiàn)
3.1 根據(jù)異常分類自定義異常類
3.1.1 自定義項目系統(tǒng)級異常
//自定義異常處理器,用于封裝異常信息,對異常進(jìn)行分類
public class SystemException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public SystemException(Integer code, String message) {
super(message);
this.code = code;
}
public SystemException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
}
}
3.1.2 自定義項目業(yè)務(wù)級異常
//自定義異常處理器,用于封裝異常信息,對異常進(jìn)行分類
public class BusinessException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public BusinessException(Integer code,String message,Throwable cause) {
super(message, cause);
this.code = code;
}
}
3.2 自定義異常編碼(持續(xù)補充)
public class Code {
//之前其他狀態(tài)碼省略沒寫,以下是新補充的狀態(tài)碼,可以根據(jù)需要自己補充
public static final Integer SYSTEM_ERR = 50001;
public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
public static final Integer SYSTEM_UNKNOW_ERR = 59999;
public static final Integer BUSINESS_ERR = 60002;
}
3.3 觸發(fā)自定義異常
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
//在getById演示觸發(fā)異常,其他方法省略沒有寫進(jìn)來
public Book getById(Integer id) {
//模擬業(yè)務(wù)異常,包裝成自定義異常
if(id <0){
throw new BusinessException(Code.BUSINESS_ERR,"請不要使用你的技術(shù)挑戰(zhàn)我的耐性!");
}
}
}
3.4 在異常通知類中攔截并處理異常
@RestControllerAdvice //用于標(biāo)識當(dāng)前類為REST風(fēng)格對應(yīng)的異常處理器
public class ProjectExceptionAdvice {
//@ExceptionHandler用于設(shè)置當(dāng)前處理器類對應(yīng)的異常類型
@ExceptionHandler(SystemException.class)
public Result doSystemException(SystemException ex){
//記錄日志
//發(fā)送消息給運維
//發(fā)送郵件給開發(fā)人員,ex對象發(fā)送給開發(fā)人員
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException ex){
return new Result(ex.getCode(),null,ex.getMessage());
}
//除了自定義的異常處理器,保留對Exception類型的異常處理,用于處理非預(yù)期的異常
@ExceptionHandler(Exception.class)
public Result doOtherException(Exception ex){
//記錄日志
//發(fā)送消息給運維
//發(fā)送郵件給開發(fā)人員,ex對象發(fā)送給開發(fā)人員
return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系統(tǒng)繁忙,請稍后再試!");
}
}
測試:在postman中發(fā)送請求訪問getById方法,傳遞參數(shù)-1,得到以下結(jié)果:
【重點】
1 準(zhǔn)備工作
為了確保靜態(tài)資源能夠被訪問到,需要設(shè)置靜態(tài)資源過濾
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pages/**")
.addResourceLocations("/pages/");
registry.addResourceHandler("/css/**")
.addResourceLocations("/css/");
registry.addResourceHandler("/js/**")
.addResourceLocations("/js/");
registry.addResourceHandler("/plugins/**")
.addResourceLocations("/plugins/");
}
}
2 列表查詢功能
- 前端代碼
//列表
getAll() {
//發(fā)送ajax請求
axios.get("/books").then((res)=>{
this.dataList = res.data.data;
});
}
3 添加功能
- 前端代碼
//彈出添加窗口
handleCreate() {
this.dialogFormVisible = true;
this.resetForm();
},
//重置表單
resetForm() {
this.formData = {};
},
//添加
handleAdd () {
//發(fā)送ajax請求
axios.post("/books",this.formData).then((res)=>{
console.log(res.data);
//如果操作成功,關(guān)閉彈層,顯示數(shù)據(jù)
if(res.data.code == 20011){
this.dialogFormVisible = false;
this.$message.success("添加成功");
}else if(res.data.code == 20010){
this.$message.error("添加失敗");
}else{
this.$message.error(res.data.msg);
}
}).finally(()=>{
this.getAll();
});
},
- 后臺代碼改進(jìn)
@Service
public class BookServiceImpl implements BookService {
@Autowire