基于原型模式和享元模式完成POJO属性拷贝

本文介绍了如何使用BeanCopier工具类实现Java对象间的属性高效拷贝,通过缓存BeanCopier实例来提升性能,避免重复创建。在实体类PriorityDO中实现了clone方法,利用BeanCopierUtils进行属性拷贝。在服务层中,使用该工具类将PriorityDO对象转换为PriorityDTO对象。
摘要由CSDN通过智能技术生成

1 BeanCopier工具类代码:

pom文件中引入依赖
 <!-- cglib的BeanCopier需要的依赖 -->
	    <dependency>  
            <groupId>asm</groupId>  
            <artifactId>asm</artifactId>  
            <version>3.3.1</version>  
        </dependency>  
        <dependency>  
            <groupId>asm</groupId>  
            <artifactId>asm-commons</artifactId>  
            <version>3.3.1</version>  
        </dependency>  
        <dependency>  
            <groupId>asm</groupId>  
            <artifactId>asm-util</artifactId>  
            <version>3.3.1</version>  
        </dependency>  
        <dependency>  
            <groupId>cglib</groupId>  
            <artifactId>cglib-nodep</artifactId>  
            <version>2.2.2</version>  
        </dependency>

/**
 * BeanCopier工具类
 */
public class BeanCopierUtils {

	/**
	 * BeanCopier缓存
	 */
	public static Map<String, BeanCopier> beanCopierCacheMap = new HashMap<String, BeanCopier>();  
      
	/**
	 * 将source对象的属性拷贝到target对象中去
	 * @param source source对象
	 * @param target target对象
	 */
    public static void copyProperties(Object source, Object target){  
        String cacheKey = source.getClass().toString() + 
        		target.getClass().toString();  
        
        BeanCopier beanCopier = null;  
        
        // 线程1和线程2,同时过来了
        
        if (!beanCopierCacheMap.containsKey(cacheKey)) {  
        	// 两个线程都卡这儿了
        	// 但是此时线程1先获取到了锁,线程2就等着
        	synchronized(BeanCopierUtils.class) {
        		// 线程1进来之后,发现这里还是没有那个BeanCopier实例
        		// 此时线程2,会发现缓存map中已经有了那个BeanCopier实例了,此时就不会进入if判断内的代码
        		 if(!beanCopierCacheMap.containsKey(cacheKey)) { 
        			 // 进入到这里会创建一个BeanCopier实例并且放在缓存map中
        			 beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);  
        			 beanCopierCacheMap.put(cacheKey, beanCopier);  
        		 } else {
        			 beanCopier = beanCopierCacheMap.get(cacheKey);   
        		 }
        	}
        } else {  
            beanCopier = beanCopierCacheMap.get(cacheKey);   
        }
        beanCopier.copy(source, target, null);  
    }  
  
}  


2 具体实体类代码

@Data
public class PriorityDO {

    private static final Logger logger = LoggerFactory.getLogger(PriorityDO.class);

    /**
     * id
     */
    private Long id;
    /**
     * 权限编号
     */
    private String code;
    /**
     * 权限URL
     */
    private String url;
    /**
     * 权限备注
     */
    private String priorityComment;
    /**
     * 权限类型
     */
    private Integer priorityType;
    /**
     * 父权限id
     */
    private Long parentId;
    /**
     * 权限的创建时间
     */
    private Date gmtCreate;
    /**
     * 权限的修改时间
     */
    private Date gmtModified;

    public <T> T clone(Class<T> clazz) {
        T target = null;
        try {
            target = clazz.newInstance();
        } catch (Exception e) {
            logger.error("类型转换异常", e);
        }
        BeanCopierUtils.copyProperties(this, target);
        return target;
    }

3在service中具体使用工具类进行属性拷贝

  @Override
    public List<PriorityDTO> listRootPriorities() throws Exception {
        List<PriorityDTO> priorityDTOs = null;
      try {
          List<PriorityDO> priorityDOs = priorityDAO.listRootPriorities();
          if (CollectionUtils.isEmpty(priorityDOs)){
              return null;
          }
          priorityDTOs = new ArrayList<PriorityDTO>(priorityDOs.size());
          for (PriorityDO priorityDO : priorityDOs){
              priorityDTOs.add(priorityDO.clone(PriorityDTO.class));
          }
          return priorityDTOs;
      }catch (Exception e){
          logger.error("error",e);
      }
      return priorityDTOs;
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值