程式設計師你為什麼這麼累? - Controller規範
導讀:
介面定義:
第一篇文章中,我貼了2段程式碼,第一個是原生態的,第2段是我指定了介面定義規範,使用AOP技術之後最終交付的程式碼,從15行到1行,自己感受一下。今天來說說大家關注的AOP如何實現。
先說說Controller規範,主要的內容是就是裡面的內容,你只要遵循裡面的規範,controller就問題不大,除了這些,還有另外的幾點:
1 所有函式返回統一的ResultBean/PageResultBean格式所有函式返回統一的ResultBean/PageResultBean格式,原因見我的介面定義這個貼。沒有統一格式,AOP無法玩,更加重要的是前臺程式碼很不好寫。當然類名你可以按照自己喜好隨便定義,如就叫Result。
大家都知道,前臺程式碼很難寫好做到重用,而我們返回相同資料結構後,前臺程式碼可以這樣寫(方法handlerResult的重用):
// 查詢所有配置項記錄
function fetchAllConfigs() {
$.getJSON('config/all', function(result) {
handlerResult(result, renderConfigs);
});
}
// 根據id刪除配置項
function deleteConfig(id) {
$.post('config/delete', {
id : id
}, function(result) {
console.log('delete result', result);
handlerResult(result, fetchAllConfigs);
});
}
/**
* 後臺返回相同的資料結構,前臺的程式碼才好寫才能重用
* @param result: ajax返回的結果
* @param fn: 成功的處理函式(傳入data)
*/
function handlerResult(result, fn) {
// 成功執行操作,失敗提示原因
if (result.code == 0) {
fn(result.data);
}
// 沒有登陸異常,重定向到登陸頁面
else if (result.code == -1) {
showError("沒有登入");
}
// 引數校驗出錯,直接提示
else if (result.code == 1) {
showError(result.msg);
}
// 沒有許可權,顯示申請許可權電子流
else if (result.code == 2) {
showError("沒有許可權");
} else {
// 不應該出現的異常,應該重點關注
showError(result.msg);
}
}
2 ResultBean/PageResultBean是controller專用的,不允許往後傳! 3 Controller做引數格式的轉換,不允許把json,map這類物件傳到services去,也不允許services返回json、map。 一般情況下!寫過程式碼都知道,map,json這種格式靈活,但是可讀性差,如果放業務資料,每次閱讀起來都比較困難。定義一個bean看著工作量多了,但程式碼清晰多了。
4 引數中一般情況不允許出現Request,Response這些物件主要是可讀性問題。一般情況下不允許,除非要操作流。
5 不需要列印日誌日誌在AOP裡面會列印,而且我的建議是大部分日誌在Services這層列印。
規範裡面大部分是 不要做的項多,要做的比較少,落地比較容易。
ResultBean定義帶泛型,使用了lombok。
@Data
public class ResultBean implements Serializable {
private static final long serialVersionUID = 1L;
public static final int NO_LOGIN = -1;
public static final int SUCCESS = 0;
public static final int FAIL = 1;
public static final int NO_PERMISSION = 2;
private String msg = "success";
private int code = SUCCESS;
private T data;
public ResultBean() {
super();
}
public ResultBean(T data) {
super();
this.data = data;
}
public ResultBean(Throwable e) {
super();
this.msg = e.toString();
this.code = FAIL;
}
}
AOP程式碼,主要就是列印日誌和捕獲異常,異常要區分已知異常和未知異常,其中未知的異常是我們重點關注的,可以做一些郵件通知啥的,已知異常可以再細分一下,可以不同的異常返回不同的返回碼:
/**
* 處理和包裝異常
*/
public class ControllerAOP {
private static final Logger logger = LoggerFactory.getLogger(ControllerAOP.class);
public Object handlerControllerMethod(ProceedingJoinPoint pjp) {
long startTime = System.currentTimeMillis();
ResultBean> result;
try {
result = (ResultBean>) pjp.proceed();
logger.info(pjp.getSignature() + "use time:" + (System.currentTimeMillis() - startTime));
} catch (Throwable e) {
result = handlerException(pjp, e);
}
return result;
}
private ResultBean> handlerException(ProceedingJoinPoint pjp, Throwable e) {
ResultBean> result = new ResultBean();
// 已知異常
if (e instanceof CheckException) {
result.setMsg(e.getLocalizedMessage());
result.setCode(ResultBean.FAIL);
} else if (e instanceof UnloginException) {
result.setMsg("Unlogin");
result.setCode(ResultBean.NO_LOGIN);
} else {
logger.error(pjp.getSignature() + " error ", e);
//TODO 未知的異常,應該格外注意,可以傳送郵件通知等
result.setMsg(e.toString());
result.setCode(ResultBean.FAIL);
}
return result;
}
}
AOP配置:(關於用java程式碼還是xml配置,這裡我傾向於xml配置,因為這個會不定期改動)
<!-- aop -->
現在知道為什麼要返回統一的一個ResultBean了:
- 為了統一格式
- 為了應用AOP
- 為了包裝異常資訊
分頁的PageResultBean大同小異,大家自己依葫蘆畫瓢自己完成就好了。
貼一個簡單的controller(左邊的箭頭表示AOP攔截了)。請對比 裡面原來的程式碼檢視,沒有對比就沒有傷害。
最後說一句,先有統一的介面定義規範,然後有AOP實現。先有思想再有技術。技術不是關鍵,AOP技術也很簡單,這個帖子的關鍵點不是技術,而是習慣和思想,不要撿了芝麻丟了西瓜。網路上講技術的貼多,講習慣、風格的少,這些都是我工作多年的行之有效的經驗之談,望有緣人珍惜。
覺得有用請點贊加關注,加星,fork,:)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3549/viewspace-2800728/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 程式設計師你為什麼這麼累? - 配置規範程式設計師
- 程式設計師你為什麼這麼累?程式設計師
- 你為什麼選擇程式設計師這個職業?程式設計師
- 程式設計師,你自豪什麼程式設計師
- 你為什麼成為一名程式設計師?程式設計師
- 程式設計師為什麼討厭這些語言程式設計師
- 作為程式設計師,你的夢想是什麼?程式設計師
- 程式設計師,為什麼如此迷茫?程式設計師
- 女程式設計師,為什麼比男程式設計師少???程式設計師
- 為什麼你學不好程式設計程式設計
- 1024為什麼是程式設計師日程式設計師
- 【1024程式設計師節】程式設計師,你學程式設計的初衷是什麼?程式設計師
- 你憑什麼做好一個程式設計師?程式設計師
- 為什麼要成為「無敵」程式設計師?程式設計師
- 為什麼成為一名程式設計師?程式設計師
- Java程式設計師工資為什麼這麼高?想要入門Java怎麼辦?Java程式設計師
- 程式設計師壓力那麼大,為什麼還要選擇做程式設計師程式設計師
- 【轉發】為什麼說程式設計師是一個極度勞累的工作?程式設計師
- 中國程式設計師為什麼要跳槽?程式設計師
- 程式設計師為什麼千萬不要瞎努力?程式設計師
- 為什麼程式設計師在學習程式設計的時候什麼都記不住?程式設計師
- 【1024程式設計師節】為什麼有些程式設計師下班比你早?程式設計師
- IT程式設計師必知!TCP/IP為什麼會有這麼多的致命漏洞?程式設計師TCP
- 程式設計師工資為什麼普遍很高,原來是因為這個...程式設計師
- 程式設計師,你離年薪100萬差什麼?程式設計師
- 程式設計師為什麼要高薪?看完讓你勇於為自己開價程式設計師高薪
- 為什麼程式設計師千萬不要重寫程式碼?程式設計師
- 程式設計師為什麼一定要用Linux?程式設計師Linux
- 為什麼說程式設計師做外包沒前途?程式設計師
- 為什麼程式設計師做外包會被瞧不起?程式設計師
- 你想成為什麼級別的程式設計師?程式設計師
- 程式設計師為什麼一定要用 Linux ?程式設計師Linux
- 為什麼程式設計師一定要學Linux程式設計師Linux
- 為什麼高階程式設計師討厭程式設計面試? - Adam程式設計師面試
- 作為程式設計師為什麼要閱讀原始碼程式設計師原始碼
- 你覺得程式設計師最大的悲哀是什麼?程式設計師
- 你構建的程式碼為什麼這麼大
- 程式設計師為什麼焦慮於程式語言和框架?程式設計師框架