对象拷贝工具,Orika, BeanUtils浅入浅出

背景:

    随着业务的深入, 越来越多的pojo对象被创建出来, 大量的对象转换再所难免,那么到底有什么工具可以减少频繁的getter/setter呢?

 

下面为大家推荐几款好用的对象属性拷贝工具:

 

 这个xmind已经把大致的工具都介绍完了, 前面的经常见到的就不再赘述, 我们从Orika开始讲起:

orika: 原本是google开源工具, 16年停止维护了, 用起来还是非常的方便的

下面两个是需要转换的类, 有两个字段名不同, 那么orika是怎么解决这个问题的呢?

package domain;

public class Person {

	private String name;
	
	private Integer age;
	
	private String six;
	
	private String code;
	
	private Double height;
       .... getter/setter
	
}
package domain;

import com.googlecode.jmapper.annotations.JGlobalMap;
import com.googlecode.jmapper.annotations.JMap;

public class Student {
	
	private String name;
	
	private Integer age;
	
	private String six;
	
	private Double stature;
	
	private String stuCode;

	.... getter/setter

}

我们要完成这两个对象之间的转换:

@Component
public class MapperConverter{
public static final DefaultMapperFactory factory = new DefaultMapperFactory.Builder().build();

    @PostConstruct // 这个是在加载servlet的时候加载这个注册文件.大家留意启动日志会发现
    public void register() { // 这里设置对应关系, 注意orika是单向映射的, 如果需要从person -> student 需要再配置一个
       factory.classMap(Student.class, Person.class)
            .field("stature", "height")
            .field("stuCode", "code")
            .byDefault().register();
}

test:

Person person = MapperConverter.factory.getMapperFacade().map(student, Person.class);
System.out.println(person);

这里奉上orika的工具类: 

package com.intime.card.util;

import java.util.HashMap;
import java.util.Map;

import ma.glasnost.orika.CustomConverter;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory.Builder;
import ma.glasnost.orika.metadata.ClassMapBuilder;
import ma.glasnost.orika.metadata.Type;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MapperConverter {

    private static final Logger log = LoggerFactory.getLogger(MapperConverter.class);
    protected static final MapperFactory factory = new DefaultMapperFactory.Builder().build();

    public MapperConverter() {
    }

    public static MapperFactory getConverter() {
        return factory;
    }

    public static <A, B> ClassMapBuilder<A, B> classMap(Class<A> aType, Class<B> bType) {
        return factory.classMap(aType, bType);
    }

    public static <T> T convert(Object obj, Class<T> tClass) {
        return factory.getMapperFacade().map(obj, tClass);
    }

    public static <S, T> void convert(S s, T t) {
        factory.getMapperFacade().map(s, t);
    }

    static {
        factory.getConverterFactory().registerConverter(new CustomConverter<Map<String, Object>, Map<String, Object>>() {
            @Override
            public Map<String, Object> convert(Map<String, Object> source, Type<? extends Map<String, Object>> destinationType, MappingContext mappingContext) {
                return new HashMap(source);
            }
        });
        factory.getConverterFactory().registerConverter(new CustomConverter<Map<Object, Object>, Map<Object, Object>>() {
            @Override
            public Map<Object, Object> convert(Map<Object, Object> source, Type<? extends Map<Object, Object>> destinationType, MappingContext mappingContext) {
                return new HashMap(source);
            }
        });
    }
}

ps: 工具类是抄公司大神的, 拿出来分享一下, 不涉及业务.

 之后会持续更新JMapper 和 MapStruct 的 简单用法, 欢迎大家一起讨论. 如果使用的是DDD领域模型的架构的话, 你一定用得到

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值