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