`

使用Cglib的BeanCopier实现Bean的拷贝

    博客分类:
  • java
阅读更多

 

      选择Cglib的BeanCopier进行Bean拷贝的理由是,其性能要比Spring的BeanUtils,Apache的BeanUtils和PropertyUtils要好很多,尤其是数据量比较大的情况下。

 

       下面看具体例子:

package com.yusj.utils;

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

import net.sf.cglib.beans.BeanCopier;

/**
 * 
 * 将beancopier做成静态类,方便拷贝
 * <br>创建日期:2015年12月1日
 * <br><b>Copyright 2015 UTOUU All Rights Reserved</b>
 * @author yushaojian
 * @since 1.0
 * @version 1.0
 */
public class CglibBeanCopierUtils {
	
	/**
	 * 
	 */
	public static Map<String, BeanCopier> beanCopierMap = new HashMap<String, BeanCopier>();
	
	/** 
	* @Title: copyProperties 
	* @Description: TODO(bean属性转换) 
	* @param source 资源类
	* @param target  目标类 
	* @author yushaojian
	* @date 2015年11月25日下午4:56:44
	*/
	public static void copyProperties(Object source,Object target){
		String beanKey = generateKey(source.getClass(),target.getClass());
		BeanCopier copier = null;
		if (!beanCopierMap.containsKey(beanKey)) {
			copier = BeanCopier.create(source.getClass(), target.getClass(), false);
			beanCopierMap.put(beanKey, copier);
		}else {
			copier = beanCopierMap.get(beanKey);
		}
		copier.copy(source, target, null);
	}
	private static String generateKey(Class<?>class1,Class<?>class2){
		return class1.toString() + class2.toString();
	}
	/*注:
	(1)相同属性名,且类型不匹配时候的处理,ok,但是未满足的属性不拷贝;
	(2)get和set方法不匹配的处理,创建拷贝的时候报错,无法拷贝任何属性(当且仅当sourceClass的get方法超过set方法时出现)
	(3)BeanCopier 
	初始化例子:BeanCopier copier = BeanCopier.create(Source.class, Target.class, useConverter=true)
	第三个参数userConverter,是否开启Convert,默认BeanCopier只会做同名,同类型属性的copier,否则就会报错.
	copier = BeanCopier.create(source.getClass(), target.getClass(), false);
	copier.copy(source, target, null);
	(4)修复beanCopier对set方法强限制的约束
	改写net.sf.cglib.beans.BeanCopier.Generator.generateClass(ClassVisitor)方法
	将133行的
	MethodInfo write = ReflectUtils.getMethodInfo(setter.getWriteMethod());
	预先存一个names2放入
	 109        Map names2 = new HashMap();
	 110        for (int i = 0; i < getters.length; ++i) {
	 111          names2.put(setters[i].getName(), getters[i]);
	            }
	调用这行代码前判断查询下,如果没有改writeMethod则忽略掉该字段的操作,这样就可以避免异常的发生。*/

}

 

maven依赖如下4个包:

<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>

 

 

 

 

 

 

 

 

 

 

2
0
分享到:
评论
2 楼 sanshao 2017-05-22  
roompig 写道
beancopier只实现了浅拷贝的功能,如果要实现深拷贝,则需要自定义实现。


支持,浅拷贝问题,一定要注意,对于Bean中存在引用变量,最好代码实现深拷贝
1 楼 roompig 2016-11-30  
beancopier只实现了浅拷贝的功能,如果要实现深拷贝,则需要自定义实现。

相关推荐

    Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier

    这篇文章将对比分析Apache BeanUtils、PropertyUtils、Spring BeanUtils以及Cglib BeanCopier这四个常用的Bean复制工具的性能和特点。 首先,Apache BeanUtils是Apache Commons项目的一部分,提供了一系列便捷的...

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)

    基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...

    对象克隆、复制工具

    对象复制工具,基于cglib BeanCopier 实现对实体对象、持久化对象、代理对象的克隆和复制, 避免重复克隆和复制,避免无限循环引用,(校验hashCode) 可指定实体对象和集合属性的克隆深度

    AOP使用CGLIB实现AOP功能

    Spring AOP实现方法之一:CGLIB 实现AOP功能

    AOP-CGLIB学习-实现简单的注解权限系统

    标题中的"AOP-CGLIB学习-实现简单的注解权限系统"指的是使用Spring的面向切面编程(AOP)特性,结合CGLIB库来创建一个基于注解的权限控制系统。在这个系统中,通过CGLIB动态代理技术,可以对带有特定注解的方法进行...

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...

    Spring学习笔记(14)----使用CGLIB实现AOP功能

    在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有...

    CGlib实现动态代理(承接上面JDK实现动态代理)

    在Java中,CGlib是一个非常重要的工具,特别是在AOP(面向切面编程)和ORM(对象关系映射)框架中,如Spring和Hibernate广泛使用它来实现代理功能。 CGlib动态代理的工作原理是通过继承被代理的目标类来创建子类,...

    spring_aop_cglib的实现方式

    在Spring AOP(面向切面编程)中,CGLIB是一个重要的动态代理库,它用于在运行时创建子类以实现对目标对象的代理。CGLIB是针对那些不支持接口代理(例如Java中的final类)的情况而设计的。下面我们将深入探讨Spring ...

    简单实现Cglib子类代理

    在Spring框架中,当目标对象没有实现接口时,Spring会默认使用Cglib进行代理。 CGLIB全称为Code Generation Library,它能够生成Java字节码并将其编译为Class对象。Cglib通过继承机制来创建代理对象,因为不是所有...

    cglib-2.2.2.jar(修订版)

    at net.sf.cglib.beans.BeanCopier$Generator.generateClass(BeanCopier.java:133) at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) at ...

    cglib的依赖包

    2. **AOP实现**:在Spring框架中,CGlib是实现AOP的重要组件。它能够生成代理对象,当方法被调用时,先执行切面逻辑,然后再执行原方法的代码,这样实现了对业务代码的透明化增强。 3. **性能优化**:对于一些性能...

    基于MAVEN项目的CGLib动态代理原理及实现

    本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置...

    cglib代理模式要使用的相关jar包

    本文将重点介绍使用CGLIB库实现的动态代理。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被广泛应用,如Spring AOP。CGLIB通过字节码技术生成代理类,...

    JDK和CGlib分别实现的动态代理源代码

    JDK和CGlib是两种常用的动态代理实现方式,它们各自有不同的特性和使用场景。 首先,我们来详细了解一下JDK动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect....

    cglib实现动态代理依赖jar包

    在实际应用中,CGLib通常与AOP框架结合使用,如Spring AOP,它可以拦截并增强方法的执行,实现如日志记录、事务管理、权限控制等功能。同时,由于CGLib不需要目标类实现接口,因此对于那些无法修改源代码的第三方库...

    使用CGLIB模拟spring的拦截器

    CGLIB通过创建目标类的子类并覆盖其方法来实现动态代理,即使目标类没有实现任何接口。 首先,我们需要理解Spring拦截器的基本原理。在Spring中,Interceptor(拦截器)是实现了`HandlerInterceptor`接口的类。这个...

Global site tag (gtag.js) - Google Analytics