我們團隊在過去的兩年里面在這個方面做了一些常識,寫出來供網友參考、拍磚。
場景是企業應用,有大量類似的業務邏輯。
建立了一系列的組件,有技術封裝類(例如對jsf的封裝),有業務處理類的(例如權限,包含用戶、角色等的維護功能,包含頁面)。
這些組件的發布形式都是jar。頁面在META-INF/resources里面。其中也包含了spring的bean(Annotation定義和xml定義)。
具體項目中,想要用什么功能,就依賴什么組件的jar。基礎結構上提供如下幾個關鍵點:
1.找頁面的時候在webapp目錄下找不到,就去jar包中找
這個可以讓組件的jar種的頁面生效。而且,如果組件的頁面不符合項目要求,可以在webapp目錄下寫頁面,相當于是覆蓋組件的頁面。
2.覆蓋組件中的bean。例如有一個UserController,項目認為組件的功能不符合要求,可以以某種機制覆蓋為項目的bean。
這個簡單的可以使用這個規則做到:spring可以配置讓xml中定義的bean替換annotation定義的bean。如果bean在組件中就是用xml方式定義的,那么可以在具體項目中指定不加載某些spring的xml配置文件實現。
3.覆蓋組件中的實體模型
因為組件要完成一整塊的業務,所以其中中包含了模型。例如權限組件會包含User,Role等模型。如果項目認為要擴展屬性(字段),那么可以方便的擴展。我采用的具體做法是在實體類上加入一個Transient的Component,類型是一個抽象的ExtendComponent類。然后擴展了一部分hibernate的代碼,在項目啟動時根據配置讓這個component不再Transient,并且指定具體類型。
根據以上三點,最后的效果是,如果組件功能符合,那么幾乎放個jar包進去(或者做一些配置)就完全可用(例如用戶管理、權限過濾等等功能)。如果不符合,那么采用以上三種機制來擴展組件。