Dozer推土机。

2024-02-23 17:50
文章标签 dozer 推土机

本文主要是介绍Dozer推土机。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 以前通常使用的都是Jakarta Commons BeanUtils 包来做bean之间的属性拷贝,这次在看springside3.1的时候发现了里面推荐Dozer来做,而不是BeanUtils包很是纳闷。于是上Dozer官网进行了一番查看,作了一些学习笔记的摘要。
      其实看老外写的英文文档还是很舒服的,没有晦涩的语句和单词,反而觉得那些高手写出来的寥寥几句话蕴含了一种技术高度的积累,可以体会到另一层面的思路。言归正传

一。Why Map?

为什么要做Mapping的映射?特别是在使用Webservice和Hessian等垮系统模块的时候,Model对象通常使用DTO解耦,eg。(springsied的例子)

 

Java代码   收藏代码
  1. Web Service传输Role信息的DTO.  
Java代码   收藏代码
  1. package org.springside.examples.miniservice.ws.user.dto;  
  2.   
  3. import javax.xml.bind.annotation.XmlType;  
  4.   
  5. import org.apache.commons.lang.builder.ToStringBuilder;  
  6. import org.springside.examples.miniservice.ws.Constants;  
  7.   
  8. /** 
  9.  * Web Service传输Role信息的DTO. 
  10.  *  
  11.  * 使用JAXB 2.0的annotation标注JAVA-XML映射,尽量使用默认约定. 
  12.  *  
  13.  * @author calvin 
  14.  */  
  15. @XmlType(name = "Role", namespace = Constants.NS)  
  16. public class RoleDTO {  
  17.   
  18.     private Long id;  
  19.     private String name;  
  20.   
  21.     public Long getId() {  
  22.         return id;  
  23.     }  
  24.   
  25.     public void setId(Long id) {  
  26.         this.id = id;  
  27.     }  
  28.   
  29.     public String getName() {  
  30.         return name;  
  31.     }  
  32.   
  33.     public void setName(String name) {  
  34.         this.name = name;  
  35.     }  
  36.   
  37.     /** 
  38.      * 重新实现toString()函数方便在日志中打印DTO信息. 
  39.      */  
  40.     @Override  
  41.     public String toString() {  
  42.         return ToStringBuilder.reflectionToString(this);  
  43.     }  
  44. }  

在自己的系统内部,定义User类,

Java代码   收藏代码
  1. package org.springside.examples.miniservice.entity.user;  
  2. public class User extends IdEntity {  
  3. }  

 使用Dozer来进行转换,将外部Webservice参数对象map到系统内部的user对象

Java代码   收藏代码
  1. List<User> userList = userManager.getAll();  
  2. List<UserDTO> userDTOList = new ArrayList<UserDTO>();  
  3.     for (User userEntity : userList) {  
  4.         userDTOList.add((UserDTO) dozer.map(userEntity, UserDTO.class));  
  5. }  

Dozer主页上的解释:

For distributed systems, a side effect is the passing of domain objects between different systems. Typically, you won't want internal domain objects exposed externally and won't allow for external domain objects to bleed into your system. 

Data object mapping is an important part of layered service oriented architectures. Pick and choose the layers you use mapping carefully. Do not go overboard as there is maintenance and performance costs associated with mapping data objects between layers. 

Mapping between data objects has been traditionally addressed by hand coding value object assemblers (or converters) that copy data between the objects. Most programmers will develop some sort of custom mapping framework and spend countless hours and thousands of lines of code mapping to and from their different data object.  


二。 chooice :Jakarta Commons Bean Utils package ,Dozer

Dozer supports simple property mapping, complex type mapping, bi-directional mapping, implicit-explicit mapping, as well as recursive mapping. This includes mapping collection attributes that also need mapping at the element level.

可以明显的看到,Dozer支持复杂映射,自定义配置映射。相比起Beanutil的方法,显然可以做到更多的事情。(即便是默认的转换,Dozer也能够自动完成一样变量名字段之间的类型转换)


三。试用一把


step1

Java代码   收藏代码
  1. Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();   
  2. DestinationObject destObject = mapper.map(sourceObject, DestinationObject.class);  

 step2 :Specifying Custom Mappings via XML

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mappings PUBLIC "-//DOZER//DTD MAPPINGS//EN"  
  3.    "http://dozer.sourceforge.net/schema/beanmapping.xsd">  
  4. <mappings>  
  5.   <configuration>  
  6.     <stop-on-errors>true</stop-on-errors>  
  7.     <date-format>MM/dd/yyyy HH:mm</date-format>  
  8.     <wildcard>true</wildcard>  
  9.   </configuration>  
  10.   
  11.   <mapping>  
  12.     <class-a>yourpackage.yourSourceClassName</class-a>  
  13.     <class-b>yourpackage.yourDestinationClassName</class-b>  
  14.       <field>  
  15.         <A>yourSourceFieldName</A>  
  16.         <B>yourDestinationFieldName</B>  
  17.       </field>  
  18.   </mapping>   
  19.               
  20.   other custom class mappings would go here.......     
  21.                      
  22. </mappings>  

 3.注入配置Injecting Custom Mapping Files

Dozer同样支持IOC容器的注入(现在很难找到不支持spring容器的项目了),同样也支持代码方式的注入:


The Dozer mapping xml file(s) define any custom mappings that can't be automatically performed by the Dozer mapping engine. Any custom Dozer mapping files need to be injected into the Mapper implementation(org.dozer.DozerBeanMapper). Both setter-based and constructor-based injection are supported.
Preferably, you will be using an IOC framework such as Spring for these Dozer injection requirements. Alternatively, the injection of mapping files can be done programatically. Below is a programmatic approach to creating a bean mapper. Note that this is NOT the recommended way to retrieve the bean mapper . Each new instance needs to be initialized and this consumes time as well as resources. If you are using the mapper this way just wrap it using the singleton pattern.


先看spring方式的注入:

Xml代码   收藏代码
  1. <bean id="mapper" class="org.dozer.DozerBeanMapper">  
  2.   <property name="mappingFiles">  
  3.     <list>  
  4.       <value>dozer-global-configuration.xml</value>              
  5.       <value>dozer-bean-mappings.xml</value>  
  6.       <value>more-dozer-bean-mappings.xml</value>  
  7.     </list>  
  8.   </property>  
  9. </bean>  

 

再看代码方式的注入(!!!非推荐方式)

Each new instance needs to be initialized and this consumes time as well as resources. If you are using the mapper this way just wrap it using the singleton pattern.

Java代码   收藏代码
  1. List myMappingFiles = new ArrayList();  
  2. myMappingFiles.add("dozerBeanMapping.xml");  
  3. myMappingFiles.add("someOtherDozerBeanMappings.xml");  
  4. DozerBeanMapper mapper = new DozerBeanMapper();  
  5. mapper.setMappingFiles(myMappingFiles);  
  6. DestinationObject destObject = mapper.map(sourceObject, DestinationObject.class);  
 

springside里面实现的Dozer单例:

Java代码   收藏代码
  1. package org.springside.modules.utils;  
  2.   
  3. import net.sf.dozer.util.mapping.DozerBeanMapper;  
  4. import net.sf.dozer.util.mapping.MapperIF;  
  5.   
  6. /** 
  7.  * 辅助DTO复制的Dozer工具类的单例wrapper. 
  8.  *  
  9.  * Dozer在同一JVM里使用单例即可,无需重复创建. 
  10.  * 但Dozer4自带的DozerBeanMapperSingletonWrapper必须使用dozerBeanMapping.xml作参数初始化,因此重新实现无配置文件的版本. 
  11.  *  
  12.  * @author calvin 
  13.  */  
  14. public final class DozerMapperSingleton {  
  15.   
  16.     private static MapperIF instance = new DozerBeanMapper();//使用预初始化避免并发问题.  
  17.   
  18.     private DozerMapperSingleton() {  
  19.     }  
  20.   
  21.     public static MapperIF getInstance() {  
  22.         return instance;  
  23.     }  
  24. }  

这篇关于Dozer推土机。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/739423

相关文章

dozer的用法

dozer简介 Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象。 dozer是用来对两个对象之间属性转换的工具,有了这个工具之后,我们将一个对象的所有属性值转给另一个对象时,就不需要再去写重复的调用set和get方法了。dozer其实是对我们熟知的beanutils的封装。 <?xml version="1.0" encoding="UTF

Java基础学习:Dozer映射框架

文章目录 一、Dozer 介绍二、Dozer的API映射方式三、使用1、java程序2、springboot项目(1)引入依赖(2)声明工具类(3)工具类委托spring管理 一、Dozer 介绍 Dozer是一个Java工具,主要用于在相同类型或不同复杂类型的JavaBean之间进行数据的递归复制。这个工具在分层的J2EE系统中非常有用,尤其是在JavaBean之间的数据拷

JavaEE_领域模型命名规约 与 dozer 的简单使用介绍

参考文档: DOZER开发手册总结 http://blog.csdn.net/whhahyy/article/details/48594657 使用Dozer优雅的将DO转换成VO http://www.hollischuang.com/archives/1613 Dozer 使用总结,也许对你有帮助 http://vincent1003.iteye.co

dozer 使用

加载dozer组件工具:    List mappingfilelist=new ArrayList();    mappingfilelist.add(Constants.dozerXml);    mif = new DozerBeanMapper(mappingfilelist);     mif.map(source,destination);   dozerXml 的配置信息:

【Dozer】数据映射之bean映射

项目研发过程中,避免不了和第三方系统交互,那么就会出现对同一字段,命名方式不同了,这个是比较让人头疼的事情,所以,今天就学习一下数据映射插件Dozer。 直接上代码: 1、maven引入dozer jar包: <dependency><groupId>com.github.dozermapper</groupId><artifactId>dozer-core</artifactId><ver