“@autowired”的含義是:listablebeanfactory接口定義的<t> map<string, t> getbeansoftype(class<t> var1) throws beansexception;,即擷取類型t的所有執行個體,并存放在一個map中:key集合是這些執行個體的包名、value集合是這些執行個體本身。
統一的響應體、請求體,規避map、list作參數或者響應結果的方式(尤其是參 - 數用map來包裝,這種代碼有時候看起來真的讓人很沮喪)
統一的錯誤資訊
統一的請求資料校驗
統一的接口異常捕獲
mysql建表的時候,可以按照下列順序考慮
表名,以及備注
字段定義,以及備注,注意按照下列順序定義字段!
id,主鍵,自增
按照字段的使用頻率依次定義(字段的順序為什麼重要:);
可為空的字段要提供預設值;
修改時間(mtime)
建立時間(ctime)
普通索引
組合索引
<task:executor/>标簽對應的實作類是threadpoolexecutor
pool-size(core-size和max-size):有異步請求到達時,如果目前線程數小于core-size時,則啟動一個新線程提供服務;如果目前線程數達到core-size,則将新請求放入blockqueue;如果blockqueue也滿了,則啟動新線程提供服務,直到線程池内的線程數達到max-size;
queue-capacity:blockqueue的大小
keep-alive:超過core-size的那部分線程,任務完成後線上程池中存活的時間;
rejection-policy:線程池内線程超過max-size之後,對于新來的服務請求的處理政策(忽略、抛異常或者改為同步調用)。
線程池的大小:可根據little定律(隊列中任務的平均數量等于進入速率和平均停留時間的乘積)估算。
需要通過日志列印驗證@async确實起作用了,可能有三個坑:(1)内部調用不能異步;(2)不能重複掃描,確定帶@async注解的方法所在的類隻被component-scan掃一次;(3)必須是public的,不能是public static的。參考文章如下:
<a href="http://sanjay-f.github.io/2015/08/24/spring%e7%9a%84%e4%b8%a4%e7%a7%8d%e4%bb%bb%e5%8a%a1%e8%b0%83%e5%ba%a6scheduled%e5%92%8casync/" target="_blank">spring的兩種任務排程scheduled和async</a>
<a href="http://stackoverflow.com/questions/6610563/spring-async-not-working" target="_blank">spring async not working</a>
工作中的軟體開發,要做到哪些方面?靈活開發并不是野蠻開發,最關鍵的特性是小步快跑,作為開發者,還是要從下列幾個方面考慮問題:
需求評審,産出需求文檔
設計評審,産出設計文檔
代碼開發(盡量使用最佳實踐,注意要寫基本的單元測試)
基本功能開發
日志記錄
異常處理
入參檢查
傳回結果生成
異步任務處理
代碼review:自己review => 進階開發者review;核心代碼需要團隊review
測試
功能測試(正常case、異常case)
性能測試(壓力測試)
穩定性測試
釋出
風險評估(影響範圍、後果)
復原預案(應急處理方案、服務降級等)
灰階釋出(流量灰階、使用者灰階、地域灰階等)
在spring中不能通過new一個執行個體來使用,否則在mockito測試的時候沒法預設行為;在spring中要使用其他元件,必須通過xml或者注解方式,由spring容器負責裝配。