日常開(kāi)發(fā)中經(jīng)常需要將一個(gè)對(duì)象的屬性,賦值到另一個(gè)對(duì)象中。
成都創(chuàng)新互聯(lián)專(zhuān)注于農(nóng)安網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供農(nóng)安營(yíng)銷(xiāo)型網(wǎng)站建設(shè),農(nóng)安網(wǎng)站制作、農(nóng)安網(wǎng)頁(yè)設(shè)計(jì)、農(nóng)安網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造農(nóng)安網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供農(nóng)安網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
常見(jiàn)的工具有很多,但都多少不夠簡(jiǎn)潔,要么不夠強(qiáng)大。
我們經(jīng)常使用的 Spring BeanUtils 性能較好,但是特性不足。
Bean-Mapping 提供了很多豐富的特性,便于日常開(kāi)發(fā)。
如果你追求更加極致的性能,可以考慮使用 asm 實(shí)現(xiàn)的模塊,該實(shí)現(xiàn)性能優(yōu)于 spring BeanUtils 35% 左右。
支持對(duì)象屬性的淺拷貝
支持不同名稱(chēng)字段的指定賦值
支持自定義字段屬性賦值的條件,比如目標(biāo)字段不為 null 才進(jìn)行賦值
支持自定義字段值轉(zhuǎn)換,可以轉(zhuǎn)換為其他類(lèi)型,或者相同類(lèi)型
支持屬性字段為【對(duì)象】【集合】【數(shù)組】的賦值,對(duì)象賦值更加方便。
JDK1.7 及其以上版本
Maven 3.X 及其以上版本
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>bean-mapping-core</artifactId>
<version>0.2.5</version>
</dependency>
提供一個(gè)簡(jiǎn)單的靜態(tài)方法 copyProperties。
/**
* 復(fù)制屬性
* 將 source 中的賦值給 target 中名稱(chēng)相同,且可以賦值的類(lèi)型中去。類(lèi)似于 spring 的 BeanUtils。
* @param source 原始對(duì)象
* @param target 目標(biāo)對(duì)象
*/
public static void copyProperties(final Object source, Object target)
詳情參見(jiàn) bean-mapping-test 模塊下的測(cè)試代碼。
其中 BaseSource 對(duì)象和 BaseTarget 對(duì)象的屬性是相同的。
public class BaseSource {
/**
* 名稱(chēng)
*/
private String name;
/**
* 年齡
*/
private int age;
/**
* 生日
*/
private Date birthday;
/**
* 字符串列表
*/
private List<String> stringList;
//getter & setter
}
我們構(gòu)建 BaseSource 的屬性,然后調(diào)用
BeanUtil.copyProperties(baseSource, baseTarget);
類(lèi)似于 spring BeanUtils 和 Apache BeanUtils,并驗(yàn)證結(jié)果符合我們的預(yù)期。
/**
* 基礎(chǔ)測(cè)試
*/
@Test
public void baseTest() {
BaseSource baseSource = buildBaseSource();
BaseTarget baseTarget = new BaseTarget();
BeanUtil.copyProperties(baseSource, baseTarget);
// 斷言賦值后的屬性和原來(lái)相同
Assertions.assertEquals(baseSource.getAge(), baseTarget.getAge());
Assertions.assertEquals(baseSource.getName(), baseTarget.getName());
Assertions.assertEquals(baseSource.getBirthday(), baseTarget.getBirthday());
Assertions.assertEquals(baseSource.getStringList(), baseTarget.getStringList());
}
/**
* 構(gòu)建用戶(hù)信息
* @return 用戶(hù)
*/
private BaseSource buildBaseSource() {
BaseSource baseSource = new BaseSource();
baseSource.setAge(10);
baseSource.setName("映射測(cè)試");
baseSource.setBirthday(new Date());
baseSource.setStringList(Arrays.asList("1", "2"));
return baseSource;
}
有時(shí)候我們對(duì)于性能要求較高,而對(duì)便利性要求沒(méi)有這么高。
本框架也提供了基于 asm 的復(fù)制方式,性能比 spring 好 35% 左右。
見(jiàn)文末的 benchmark。
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>bean-mapping-asm</artifactId>
<version>0.2.5</version>
</dependency>
和 BeanUtil#copyProperties(Object, Object)
使用類(lèi)似,但是暫時(shí)不支持注解等更加豐富的功能。
BaseSource baseSource = buildBaseSource();
BaseTarget baseTarget = new BaseTarget();
AsmBeanUtil.copyProperties(baseSource, baseTarget);
實(shí)際工作中,我們遇到的情況會(huì)比這個(gè)復(fù)雜一些。
比如兩個(gè)字段名稱(chēng)不同,我們也想進(jìn)行賦值,值得處理轉(zhuǎn)換等等。
Bean-Mapping 相關(guān)文檔:
01-項(xiàng)目模塊簡(jiǎn)介和預(yù)期功能
02-BeanMapping 注解的引入
03-不同名稱(chēng)字段的指定賦值
04-自定義賦值生效的條件
05-自定義字段轉(zhuǎn)換實(shí)現(xiàn)
06-支持屬性字段為【對(duì)象】【集合】【數(shù)組】的賦值
07-BeanUtil#copyProperties(Object, Class) 方法
可見(jiàn)框架默認(rèn) bean-mapping 實(shí)現(xiàn)性能一般,涉及到了太多的特性,導(dǎo)致復(fù)制性能略低于 spring。
基于 reflectasm 實(shí)現(xiàn)的 asm-bean-mapping 的性能高于 spring。
代碼示例參見(jiàn) BeanUtilBeanchmarkTest.java
相對(duì) BeanCopier 這種實(shí)現(xiàn)方式,我們的實(shí)現(xiàn)方式性能還是有很大提升空間。
后期可以考慮實(shí)現(xiàn)類(lèi)似 BeanCopier 的方式。
這個(gè)框架的源代碼全部開(kāi)源,也便于我們學(xué)習(xí)。
Bean-Mapping
名稱(chēng)欄目:基于asm實(shí)現(xiàn)比springBeanUtils性能更好的屬性拷貝框架
轉(zhuǎn)載來(lái)于:http://aaarwkj.com/article36/gpjpsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、建站公司、云服務(wù)器、商城網(wǎng)站、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)