我也造了個輪子 BeanMapping 屬性拷貝

2021-09-23 23:02:34 字數 3370 閱讀 1721

也不多羅嗦,我主要負責從多個資料來源蒐集回來的資料,構造成對應的model物件。可以看一下具體的分析過程。

每個資料來源採集回來的資料可能比較凌亂,有map物件,pojo物件,至於這個對映過程。因為是在老系統上實施,以前都沒有service的概念,在資料庫的設計會很比較亂,都是來乙個需求加幾個欄位的那一型別。 所以具體data -> model物件的對映過程,就需要額外考慮一些特殊功能。

需求整理:

處理的data是個map物件

處理的data是個pojo bean

對映過程中,處理的data屬性名和目標物件model的屬性會大不相同

對映過程中,data中的資料大多都是文字型,而對應的model會是根據業務場景定義的強型別,需要有型別轉化

對應的data可能是乙個平面型的map/bean物件,需要轉化有層次結構,帶立體的模型。比如model裡包含一些子model等

需要處理特殊情況,比如data中有個屬性是個json格式資料,需要在解析後再轉化到某幾個model屬性上

針對這些需求,回過頭看一下現在比較流行的幾個處理工具包: cglib , beanutils 。

cglib(之間的一篇分享文件:

) : 素以效能著稱,主要是beancopier,但功能很簡單。主要是解決bean之間,同名屬性的轉化,功能無法滿足

beanutils : 功能上支援到是還不錯,可以支援處理map,pojo的轉化,不同屬性型別之間的轉化,也可以支援nested子模型的對映。 但無法解決不同名屬性之間的對映,json格式類似資料的處理,還有乙個就是效能不咋的。根據原先的測試來看,應該是cglib效能的1/1000,相差了3個數量級。

說明:

在get/set中間,定義了乙個valueprocess處理外掛程式的概念,允許擴充套件相關的功能外掛程式 (自認為相比於beanutils/beancopier的非常好的亮點,擴充套件性良好)

1. 比如預設值

2. 型別轉化器

3. json資料處理

4. 日誌記錄

get/set為整個框架的核心(core)實現,valueprocess為框架的擴充套件點,允許自定義一些功能外掛程式,預設已經提供了幾個功能處理。

get/set操作類

valueprocess設計類:

客戶端使用類設計:

幾個客戶端api說明:

beancopy 和 beanmap : 都是一些擴充套件功能,基於本輪子的核心架構不變的基礎上,開發了beanutils.copyproperties() , beanutils.describe, beanutils.populate()的功能。 使用該api,可以不需要配置對映檔案,會進行自動掃瞄,就是基於同名屬性的處理前提。

11.

16.

說明:幾點說明:

srcclass/targetclass: 預設可不關注,系統會自動進行識別,在defaultvalue和convetor轉化處理。 還有一點:如果物件**現同名的屬性時,可以指定targetclass進行唯一定位

defaultvalue : 相比於beancopier和beanutils,乙個特有的特性。 大家熟悉ibatis的配置就知道會有乙個nullvalue配置,主要是方便客戶端處理,避免進行一些無謂的==null/==0這樣的處理

convetor : 相比於beanutils, 這裡允許宣告屬性之間的轉化類,比如你註冊了乙個alias別名的convetor,就可以在這裡宣告進行使用,會優先使用你定義的(如果不指定,則會進行自動根據型別進行匹配)。

自動處理會有個侷限性,就是convetor會是全域性性。比如你定義了乙個string到date的處理,以後整個jvm中所有的場景都會按照你定義的進行轉化,到時候你怎麼死自己都不知道script: 系統的高階特性,做為系統的一些擴充套件點,可以支援一些比較複雜的處理,比如以後的json/xml等處理,只需註冊你的functions。比如這裡定義: script="src.intvalue + src.integervalue"。

使用例子

3.

4.@test

5.public void testbeantobean_ok()

beancopy例子: (發覺和beancopier使用比較像)

3.

4.@test

5.public void testcopy_ok()

beanmap例子: (支援beanmap的轉化處理)

2.

3. @test

4. public void testdescribe_populate_ok()

@test

public void testdescribe_populate_ok()

copybean :

1.public class copybean
beancopy效能測試

對比的內容:

說明: 因為beanutils,propertyutils的效能太差,基本上其他的柱狀圖都看不清楚。

具體測試資料:

開啟batch優化(200w次):單位ns

純解釋執行(排除jit優化)(10w次):單位ns

1189

72780

1178

69381

method

1322

25882

fastmethod

53315961

bulkbean

1084420

beancopier

181566

hardcopy

171376

propertyutils

22143

1037770

beanutils

43980

1766392

說明:

整個過程,完成功能**大概只花了一周的時間,但是**的重構/抽取,效能優化花了我近2周的時間。效能從最初的比beanutils慢,逐步的提公升到了快幾十倍,還是比較有成就感的。

還有一點,就是自己比較滿意valueprocess概念的設計,相比於beancopier或者beanutils擴充套件性好多了,比如自身系統的功能:日誌記錄,預設值,型別轉化,script指令碼(el表示式)。都是通過擴充套件介面實現,也比較方便切換成不同的實現.。

有興趣的同學,可以看下googlecode上的**,有問題歡迎聯絡!

效能測試**:

結合了dozer的一些特性,也順便整理了一下自己的後續action的一些功能點,做了適當取捨。

issue列表:

我也看星座了

由於他們之間是5 9日宮型,所以雙子座人和寶瓶座人之間的關係總是親密異常。他們常感到心心相印,容易溝通。可是,他們也有摩擦,主要原因是因為是否講真話,對大多數雙子座人來說,他們都不願面對這問題,因為這對他們來說意義複雜。而寶瓶座人卻堅持要真話,不畏縮,不矯飾。寶瓶座是固定型,固定意味著不動搖。但寶瓶...

我現在也暈菜了(二)

接著說那天掛了 之後的事情吧。我很奇怪的是,為什麼公司這樣胡亂安排。如果換位思考,我是甲方客戶的話,我也會生氣。但是最關鍵的是要解決問題,這個問題所牽涉的技術不在我的掌握範疇之內,那麼要想解決這個問題只有找這方面有能力的資源。我立馬打 給巴斯滕,其實我知道那天他要去看sb會,但是也沒辦法。打過去,這...

造了個工具 GitHub Page搜尋工具

github page search位址 當你想搭建乙個自己的 但卻沒有伺服器,沒有資料庫等,這時候不用一籌莫展,github page可以助你一臂之力。github page是github提供給使用者為自己的專案搭建 的免費站點,只能是靜態站點,當然也不錯啦!免費就是香 官方 在官方介紹中,gih...