aop,中文名稱,切面。在不影響業務**情況下,實現想要的功能,是個真炫酷的事。
aop是個好東西,記錄日誌是必須的。
記錄資料也一樣的,那麼也是可以用aop來實現的,這裡借助註解一起解決問題吧。
因為是關鍵業務,所以意味著不是所有業務,那麼自然地就想到了,可以使用過濾的方式,也就是使用註解,如果有註解那麼就代表要記錄資料,否則不記錄。
記錄過程需要做什麼呢?
首先,因為是記錄業務資料,那麼我們可以抽象出乙個方法出來,也就是 ***.addrec()。也就是就切面裡只需呼叫記錄方法即可。
那麼還剩下幾個問題,怎樣找到這個方法?引數的處理怎麼辦?需要使用規範限制嗎?
找到這個方法,我們可以使用反射呼叫,當然需要註解進行呼叫的類和方法名稱(如果固定死則無需標註),用反射的好處就是自由,想怎麼寫就怎麼寫,要麼失敗要麼成功。但是low!
引數判定,可以根據輸入的類,進行if..else.. 判定,然後直接處理相應引數即可。這樣可以很自由,想怎麼寫引數就怎麼寫引數。但是這樣的話,這個切面就和業務**完全耦合在一起了,還多了n多無謂的判斷。很low!
那麼問題來了,怎樣才不low呢?
1. 面向介面程式設計而非面向類程式設計;
2. 使用列舉值進行註解統一規劃;
3. 使用泛型,進行引數上下限處理;
4. 使用模板方法模式封裝引數;
5. 使用執行緒池;
讓我們細看下~
面向介面程式設計,即規定所有業務處理類都實現乙個公共的介面,從而使方法不至於凌亂,定義乙個清晰的介面,更易於理解含義。各實現類只需關注自己的邏輯即可。
使用列舉值進行註解引數的限定,可以使所有業務操作都在一處進行羅列,且都符合必須的規範。另外,當哪天發現引數無法滿足某些需求時,可方便地在該列舉中加入相應引數以完成需求。
使用泛型,將引數限定一定範圍內,如要求入庫引數必須繼承某個基類以實現統一引數處理,也防止了傳入任意引數而必須做相應轉換的效能消耗。
使用模板方法模式進行引數封裝,因入參中都要求繼承乙個基類,也就是具有共性的引數,所以應具備自動處理公共引數的能力,但是不可越權處理各業務實現的處理,應讓實現類有能力自行處理個性化引數(實現類也可以不處理)。交由實現類處理個性化引數時,應使其具有絕對的能力,不應限制其發揮。
使用執行緒池技術,將額外的工作交給額外的執行緒,從而使主業務不愛影響。
具體**擼一遍:
1. 註解開啟新篇章,無註解,不工作。
@componentpublic
class
usertestservice
}
2. 切面配置,做乙個幕後的老兵。
@component@aspect
public
class
bizrecordaop
try
catch
(exception e)
finally
try);
} catch
(exception e) }}
return
retval;
}/*** 填充公共引數
*/private
void
fillbasefields(baseentity baseentity, basedto base)
}
3. 寫乙個基礎介面,讓業務去實現。
publicinte***ce bizrecordbaseserviceextends baseentity>
}
4. 寫乙個基礎類,讓所有其他業務實體繼承以實現公共引數的封裝。
@datapublic
class
baseentity
5. 打乙個組合拳,搞定。
原理淺顯,易懂。效能嘛,也ok,無需太擔心。
cmakelists實操記錄
cmake help command set qc include usr include amss set qc include usr include amss core check environment variables if env strequal 可以將其想象成乙個配置檔案 在uni...
GitLab 實操記錄
目錄 一.gitlab上傳實操 報錯 git master branch has no upstream branch 報錯 failed to push some refs to h 二.精通git 閱讀筆記 提交本地 到遠端倉庫 修改遠端倉庫位址 三.prop 1.通過 babel 和 webp...
XMLPULL解析個人實操記錄
xmlpull解析個人實操記錄 基於android 6.0 準備xml資料文件 訪問位址為電腦本機位址 完成解析某個節點 case xmlpullparser.end tag break default break eventtype xmlpullparser.next catch excepti...