先做個(gè)廣告,去皮兒網(wǎng),可以每月26日通知你是否搖號(hào)中簽。
http://www.qupier.com一直以來(lái),組件一直都建立在技術(shù)的層面上。由于業(yè)務(wù)的復(fù)雜多變,似乎沒(méi)有人想著把業(yè)務(wù)部分也做成可重用的組件。
我們團(tuán)隊(duì)在過(guò)去的兩年里面在這個(gè)方面做了一些常識(shí),寫(xiě)出來(lái)供網(wǎng)友參考、拍磚。
場(chǎng)景是企業(yè)應(yīng)用,有大量類(lèi)似的業(yè)務(wù)邏輯。
建立了一系列的組件,有技術(shù)封裝類(lèi)(例如對(duì)jsf的封裝),有業(yè)務(wù)處理類(lèi)的(例如權(quán)限,包含用戶(hù)、角色等的維護(hù)功能,包含頁(yè)面)。
這些組件的發(fā)布形式都是jar。頁(yè)面在META-INF/resources里面。其中也包含了spring的bean(Annotation定義和xml定義)。
具體項(xiàng)目中,想要用什么功能,就依賴(lài)什么組件的jar。基礎(chǔ)結(jié)構(gòu)上提供如下幾個(gè)關(guān)鍵點(diǎn):
1.找頁(yè)面的時(shí)候在webapp目錄下找不到,就去jar包中找
這個(gè)可以讓組件的jar種的頁(yè)面生效。而且,如果組件的頁(yè)面不符合項(xiàng)目要求,可以在webapp目錄下寫(xiě)頁(yè)面,相當(dāng)于是覆蓋組件的頁(yè)面。
2.覆蓋組件中的bean。例如有一個(gè)UserController,項(xiàng)目認(rèn)為組件的功能不符合要求,可以以某種機(jī)制覆蓋為項(xiàng)目的bean。
這個(gè)簡(jiǎn)單的可以使用這個(gè)規(guī)則做到:spring可以配置讓xml中定義的bean替換annotation定義的bean。如果bean在組件中就是用xml方式定義的,那么可以在具體項(xiàng)目中指定不加載某些spring的xml配置文件實(shí)現(xiàn)。
3.覆蓋組件中的實(shí)體模型
因?yàn)榻M件要完成一整塊的業(yè)務(wù),所以其中中包含了模型。例如權(quán)限組件會(huì)包含User,Role等模型。如果項(xiàng)目認(rèn)為要擴(kuò)展屬性(字段),那么可以方便的擴(kuò)展。我采用的具體做法是在實(shí)體類(lèi)上加入一個(gè)Transient的Component,類(lèi)型是一個(gè)抽象的ExtendComponent類(lèi)。然后擴(kuò)展了一部分hibernate的代碼,在項(xiàng)目啟動(dòng)時(shí)根據(jù)配置讓這個(gè)component不再Transient,并且指定具體類(lèi)型。
根據(jù)以上三點(diǎn),最后的效果是,如果組件功能符合,那么幾乎放個(gè)jar包進(jìn)去(或者做一些配置)就完全可用(例如用戶(hù)管理、權(quán)限過(guò)濾等等功能)。如果不符合,那么采用以上三種機(jī)制來(lái)擴(kuò)展組件。