`
maosheng
  • 浏览: 568179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Dozer对象间拷贝

阅读更多

使用Dozer映射复杂类型:

  1. 数据类型不一致。

  2. 级联映射。

  3. 自定义映射。

Dozer其实底层使用了现成的BeanUtil,通过反射来映射,况且Dozer应用了Cache技术,应该比自个通过BeanUtils映射性能要好点。所以一般的应用应该不存在性能问题。

Dozer对于基本类型之间转换是不用配置的,比如Sting <------>Integer ,只要属性名称相同就Ok了。

而常用的Date与String映射配置如下:

   <mapping date-format="MM-dd-yyyy">
     <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
     <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
     <field>
       <a>birthday</a>
       <b>dateOfBirth</b>
     </field>
   </mapping>

指明 CustomerPo里面的birthday对应CustomerVo里面的dateOfBirth.并且是Date与String之间双向映射。

对于属性名称不一致,也仅仅需要一个配置文件,如下:

  <mapping>
      <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
      <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
       <field>
           <a>type</a>
            <b>transferType</b>
          </field>
  </mapping>
 

指明 CustomerPo里面的type 对应CustomerVo里面的transferType.

而对以级联,比如CustomerPo里面的一个属性映射为CustomerVo里一个对象的属性,下面的配置就可以了

   <mapping>
      <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
      <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
       <field>
          <a>type</a>
           <b>transferType.type</b>
         </field>
   </mapping>

上面其实就是Dozer基本用法,也涵盖了大多数应用场景,可见基本不需要写代码,仅仅一个配置文件搞定,简单吧。

而对以更个性化的映射,就需要写代码了, 比如在CustomerPo中的into类型的transferId ,映射CustomerVo  String 类型transferType, 如果transferId =1 对应transferType=“immediateTranfer” 如果transferId =2 对应transferType=“scheduleTransfer” 反之亦然。就要写一个Customer的Map了, 如下:

import org.dozer.CustomConverter;

public class CustomerMap implements CustomConverter {

    public Object convert(Object destinationFieldValue,Object sourceFieldValue, Class<?>

                            destinationClass,Class<?> sourceClass) {
        Object returnVale = null;
        if(sourceFieldValue!=null){
            if(sourceFieldValue instanceof Integer ){
                if((Integer)sourceFieldValue == 1){
                    returnVale ="immediateTranfer";
                }
                if((Integer)sourceFieldValue == 2){
                    returnVale ="scheduleTransfer";
                }
               
            }
            if(sourceFieldValue instanceof String ){
                if("immediateTranfer".equals(destinationFieldValue)){
                    returnVale =1;
                }
                if("scheduleTransfer".equals(destinationFieldValue)){
                    returnVale =2;
                }
               
            }

        }
        return returnVale;
    }
}

 

然后在配置文件配置就Ok了 如下:

      <mapping>
         <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
         <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
       <field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
           <a>type</a>
           <b>transferType</b>
      </field>
    </mapping>

下面就是一个完整的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://dozer.sourceforge.net E:dozerdozer-5.0-srcdozer-5.0srcsiteresourcesschemabeanmapping.xsd"
    xmlns="http://dozer.sourceforge.net">
    <mapping  date-format="yyyy-MM-dd">
        <class-a>net.blogjava.vincent.pojo.UserInfo</class-a>
        <class-b>net.blogjava.vincent.vo.UserInfoVo</class-b>
        <field>
            <a>colleage.name</a>
            <b>schoolName</b>
        </field>
    </mapping>
        <mapping>
        <class-a>net.blogjava.vincent.pojo.CustomerPo</class-a>
        <class-b>net.blogjava.vincent.vo.CustomerVo</class-b>
         <field custom-converter="net.blogjava.vincent.mapUtil.CustomerMap">
            <a>type</a>
            <b>transferType</b>
         </field>
    </mapping>

</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单例:

1.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.  *   
  13.  * @author maosheng
  14.  */  
  15. public final class DozerMapperSingleton {   
  16.   
  17.     private static MapperIF instance = new DozerBeanMapper();//使用预初始化避免并发问题.   
  18.   
  19.     private DozerMapperSingleton() {   
  20.     }   
  21.   
  22.     public static MapperIF getInstance() {   
  23.         return instance;   
  24.     }   
  25. }    

2.加载dozer组件工具:
    List mappingfilelist=new ArrayList();
    mappingfilelist.add(Constants.dozer.Xml);
    mif = new DozerBeanMapper(mappingfilelist);

    mif.map(source,destination);

分享到:
评论

相关推荐

    javaEE的对象拷贝工具dozer

    Java EE对象拷贝工具Dozer是一款强大的数据映射库,它简化了在Java对象之间进行深度复制的过程。在软件开发中,特别是在业务层处理数据时,我们经常需要将一个对象的属性值复制到另一个对象中,Dozer提供了一个优雅...

    java不同对象及集合的多次复制

    - **Dozer库**:允许使用注解来定义复制规则,支持深度复制和类型转换,可以实现不同对象间的复制。 - **ModelMapper库**:提供了`ModelMapper`类,可以通过配置注解自动映射对象,简化了复制过程。 4. **集合与...

    Dozer详解

    总结来说,Dozer作为一款强大的对象映射工具,提供了丰富的映射功能,简化了Java对象间的转换工作。通过灵活的配置和自定义转换器,开发者可以应对各种复杂的映射需求。然而,在选择使用Dozer时,也应考虑其可能存在...

    dozer5.2 jar包

    4. **支持深拷贝**:除了基本的属性映射,Dozer还能处理嵌套对象和集合的映射。 5. **类型转换**:Dozer内置了一些标准的类型转换器,同时允许用户自定义转换器来处理特定的类型转换需求。 6. **事件监听**:提供...

    Dozer 使用总结,也许对你有帮助

    Dozer 是一个强大的 Java 对象映射框架,它简化了对象到对象之间的转换工作,尤其在处理复杂的数据结构时。这个工具广泛应用于企业级应用,因为它可以极大地减少手动编写转换代码的工作量。在这个总结中,我们将深入...

    dozer 架包!!!!!!!!!!

    **描述详解:** "类似struts一的beanutils的拷贝功能,不过更强大些" —— 这句话指出Dozer与Apache Struts的BeanUtils组件有相似性,它们都提供了对象属性之间的复制功能。但是,Dozer在BeanUtils的基础上进行了...

    Dozer 使用

    7. **深拷贝与浅拷贝**:区分 Dozer 的深拷贝和浅拷贝,理解它们在内存管理上的差异。 8. **类型安全的映射**:利用 `ClassMapBuilder` 创建类型安全的映射,避免类型不匹配的问题。 9. **事件监听器**:介绍如何...

    Dozer小试

    4. **深拷贝**:可以实现对象的深拷贝,即创建源对象的完整副本,改变副本不会影响原始对象。 5. **自定义转换**:提供自定义转换器机制,允许用户定义特定的转换逻辑。 **知识点五:Dozer-demo项目** "dozer-demo...

    Dozer一个JavaBean至JavaBean映射器

    Dozer不仅支持简单的属性映射,还可以进行深度映射,即嵌套对象间的映射。此外,通过实现`MappingProcessorListener`接口,用户可以定制映射过程中的事件处理,如在映射前后执行特定操作。 ### 6. 反向映射 除了...

    java不同对象之间及集合的复制

    在Java中,通过使用特定的注解处理器库(如MapStruct、Dozer等),可以声明式地定义对象间的映射关系,自动处理复制过程。这样不仅可以节省编码时间,还能减少错误。 4. **集合复制**: 当需要复制一个集合到另一个...

    bingo-bean:对象拷贝,目标是比dozer更快,功能更强大,更完整的支持泛型

    bingo-bean对象拷贝,目标是比dozer更快,功能更强大,更完整的支持泛型1、该项目是复制对象的工具,创建目的是:a)、比Dozer、FastJson更快,占用内存更小b)、不同类型间的复制,包括对自定义泛型的深层识别,参见...

    springboot-dozer-sample:Spring Spring-boot和Dozer Java Libarary的简单示例

    2. **Dozer库介绍**:Dozer是一个开源的Java对象映射库,类似于Hibernate的ORM,但专注于对象到对象的映射。它能处理复杂的数据类型转换,支持自定义映射规则,使得在业务层处理数据转换变得更加简单。 3. **集成...

    浅谈java对象之间相互转化的多种方式

    * 需要拷贝的两个对象里面都包含有另一个对象,但是另一个对象里面属性相同但是对象名不同 * 采用 JSON 来转换只要属性名一致即可 补充知识:javabean 实体类与实体类之间的快速转换 javabean 实体类与实体类之间...

    orika Java实例Demo

    在这个实例Demo中,我们将深入理解Orika的工作原理,以及如何在Java项目中有效地使用它进行对象拷贝。 ### 1. Orika简介 Orika是一个自动Java Bean映射器,它可以将一个Java Bean实例的属性值自动复制到另一个具有...

Global site tag (gtag.js) - Google Analytics