当前位置: 首页 > news >正文

网站制作与网页设计施工企业研发资金投入情况说明

网站制作与网页设计,施工企业研发资金投入情况说明,软件开发专业就业前景如何,网络品牌营销一、背景 数据流转在各层之间的过程#xff0c;应当是改头换面的#xff0c;字段属性数量#xff0c;属性名称#xff08;一般不变#xff0c;但也有重构时出现变化的情况#xff09;#xff0c;类型名称#xff08;普遍变化例如BO、VO、DTO#xff09;。对于转换的业…一、背景 数据流转在各层之间的过程应当是改头换面的字段属性数量属性名称一般不变但也有重构时出现变化的情况类型名称普遍变化例如BO、VO、DTO。对于转换的业务对象原始的做法时直接实例采用Getter与Setter方法进行逐一填充。这太低效了那我们就先了解最简单的拷贝工具。 二、问题 业界采用BeanCopyUtils、Orika、ReflectionUtils等填充工具类实现字段的拷贝。默认的实现都是以Field.getName()的值进行比对拷贝。所以针对属性名发生变化的情况很容易在不注意的情况下拷贝成null值。一旦拷贝成null值后续的业务就会受到不同程度的影响所以我设想以下两种方案解决字段变化且字段耦合面比较广泛无法直接修改字段名称的情况。 三、方案 方案一二次封装Orkia组件设计classMap字段映射配置类使用ServiceLoader服务加载器加载配置类自定义配置随用随配。缺点需要维护Java类配置变化字段的映射变化越多类越重 方案二设计类型注解与字段注解使用spring ApplicationContextAware接口设计统一快速注册classMap中的字段映射性能高快速装配。 接下来的两种方案都有一些思路以及遇到的问题及其解决方法加深相关技术理解。 四、实现 1方案一实现 核心工具类BeanCopyUtil.java import ma.glasnost.orika.MapperFacade; import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory; import java.util.List; import java.util.ServiceLoader;/*** author : forestSpringH* description:* date : Created in 2023/9/14* modified By:* project: */ public class BeanCopyUtil {private static final MapperFactory MAPPER_FACTORY;private static final MapperFacade MAPPER_FACADE;static {MAPPER_FACTORY new DefaultMapperFactory.Builder().build();MAPPER_FACADE MAPPER_FACTORY.getMapperFacade();ServiceLoaderCopyInterface serviceLoader ServiceLoader.load(CopyInterface.class);for (CopyInterface beanCopyRules : serviceLoader) {beanCopyRules.register(MAPPER_FACTORY);}}public static S, T T map(S source, ClassT targetClass) {return MAPPER_FACADE.map(source, targetClass);}public static S, T ListT mapAsList(IterableS source, ClassT targetClass) {return MAPPER_FACADE.mapAsList(source, targetClass);}}接口CopyInterface.java import ma.glasnost.orika.MapperFactory;/*** author : forestSpringH* description:* date : Created in 2023/9/14* modified By:* project: */ public interface CopyInterface {void register(MapperFactory mapperFactory); } 变化字段配置类BeanCopyRules.java import com.runjing.tms.domain.dto.applet.RiderWaybillsDistributionDetailsDto; import com.runjing.tms.repository.model.TransportExpressWaybills; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import ma.glasnost.orika.MapperFactory;/*** author : forestSpringH* description:* date : Created in 2023/9/14* modified By:* project: */ Slf4j public class BeanCopyRules implements CopyInterface{Overridepublic void register(MapperFactory mapperFactory) {log.info(加载字段映射工厂自定义字段映射);mapperFactory.classMap(TransportExpressWaybills.class, RiderWaybillsDistributionDetailsDto.class).field(expectTime,expectStartTime).field(id,waybillId).byDefault().register();} } 注意点 ServiceLoader服务加载器需要查找META-INF.services下的文件加载对应的类路劲所以如果文件中填写的也是接口CopyInterface.java的路径而不是其实现类BeanCopyRules.java的路径就会加载出来ServiceLoaderCopyInterface内部的实例为空无法进入循环。 META-INF.service下的com.runjing.tms.util.orika.CopyInterface文件 com.runjing.tms.util.orika.BeanCopyRules 2方案二实现 代码分包结构 类型注解EnableOpenFieldCopy.java import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component;import java.lang.annotation.*;/*** author : forestSpringH* description:* date : Created in 2023/9/14* modified By:* project: */ Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited Documented Component Scope(value ConfigurableBeanFactory.SCOPE_PROTOTYPE) public interface EnableOpenFieldCopy {boolean value() default true;boolean callSuper() default false;boolean callSoon() default false; } 字段注解FieldCopyMapping.java import java.lang.annotation.*;/*** author : forestSpringH* description: 字段映射注解* date : Created in 2023/9/14* modified By:* project:*/ Target({ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface FieldCopyMapping {String targetFieldName() default ;Class?[] targetClass() default {}; } SpringHolder.java关键代码段 public static ListClass? getBeanByAnnotation(Class? extends Annotation annotationClazz){Assert.notNull(serviceApplicationContext, 容器上下文获取失败);Assert.notNull(annotationClazz,注解字节码入参为空);ListString collect Arrays.stream(serviceApplicationContext.getBeanNamesForAnnotation(annotationClazz)).collect(Collectors.toList());ListClass? classList new LinkedList();if (!CollectionUtils.isEmpty(collect)){collect.forEach(s - classList.add(getBeanByName(s).getClass()));}return classList;} BeanCopyService.java核心代码段 PostConstructpublic void init() {log.info(初始化BeanCopyService组件);mapperFactory new DefaultMapperFactory.Builder().build();mapperFacade mapperFactory.getMapperFacade();log.info(加载字段拷贝映射注解类);ListClass? beanList SpringHolder.getBeanByAnnotation(EnableOpenFieldCopy.class);register(beanList);}public S, T T copyBean(S source, ClassT targetClass) {return mapperFacade.map(source, targetClass);}private void register(ListClass? beanCopyList) {if (!CollectionUtils.isEmpty(beanCopyList)) {beanCopyList.forEach(clazz - {//获取类的属性log.info(获取映射注解类:{}下字段集合, clazz.getName());ListField collect Arrays.stream(clazz.getDeclaredFields()).collect(Collectors.toList());if (!CollectionUtils.isEmpty(collect)) {collect.forEach(field - {//获取属性中打上映射注解的注解if (field.isAnnotationPresent(FieldCopyMapping.class)) {FieldCopyMapping annotation field.getAnnotation(FieldCopyMapping.class);String sourceFieldName field.getName();//获取注解上的目标字段名String targetFieldName annotation.targetFieldName();log.info(配置字段:{} 映射 {}, sourceFieldName, targetFieldName);//获取注解上的目标拷贝对象字节码数组ListClass? targetClazzList Arrays.stream(annotation.targetClass()).collect(Collectors.toList());if (!CollectionUtils.isEmpty(targetClazzList)) {//逐一注册log.info(逐一注册字段映射模型列表);targetClazzList.forEach(targetClazz - {MapperModel model new MapperModel(clazz.getName() targetClazz.getName(), clazz, targetClazz, sourceFieldName, targetFieldName);mapperModelList.add(model);});}}});}});MapString, ListMapperModel group groupByMapperKey(mapperModelList);if (!CollectionUtils.isEmpty(group)) {group.values().forEach(modelList - {log.info(开始映射{}, modelList);ClassMapBuilder?, ? classMapBuilder mapperFactory.classMap(modelList.get(0).getSourceClass(), modelList.get(0).getTargetClass());for (MapperModel model : modelList) {if (Objects.equals(modelList.get(modelList.size() - 1), model)) {log.info(映射注册完毕{}, model.getMapperKey());classMapBuilder.field(model.getSourceFieldName(), model.getTargetFieldName()).byDefault().register();} else {classMapBuilder.field(model.getSourceFieldName(), model.getTargetFieldName());}}});}}}private MapString, ListMapperModel groupByMapperKey(ListMapperModel modelList) {MapString, ListMapperModel groupMap new HashMap();if (CollectionUtils.isEmpty(modelList)) {return groupMap;}SetString keys modelList.stream().map(MapperModel::getMapperKey).collect(Collectors.toSet());keys.forEach(key - {ListMapperModel mapperModels new LinkedList();modelList.forEach(mapperModel - {if (Objects.equals(mapperModel.getMapperKey(), key)) {mapperModels.add(mapperModel);}});groupMap.put(key, mapperModels);});return groupMap;} 五、测试 Person.java测试实体 EnableOpenFieldCopy Data public class Person {FieldCopyMapping(targetFieldName id, targetClass {PersonBo.class, PersonDto.class})private int age;FieldCopyMapping(targetFieldName personName,targetClass {PersonDto.class})private String name; } PersonBo.java测试实体 Data public class PersonBo {private int id;private String name; } PersonDto.java测试实体 Data public class PersonDto {private int id;private String personName; } 单元测试代码 Testpublic void copy(){Person person new Person();person.setAge(1);person.setName(hlc);PersonBo personBo beanCopyService.copyBean(person, PersonBo.class);PersonDto personDto beanCopyService.copyBean(person, PersonDto.class);System.out.println(personBo);System.out.println(personDto);} 断点查看结果 代码逻辑还需要继续优化方案二跑通之后将会将其设计成jar包。 导入使用。
http://www.hyszgw.com/news/86447/

相关文章:

  • 张家口外贸网站建设网站代码制作软件
  • 网站开发分工中职网站建设教学计划
  • 湖北网站建设制作诸城网站建设的文章
  • 青海wap网站建设比较好深圳市工程建设交易中心官网
  • 网站建设的项目总结东莞房产网
  • 免费企业邮箱注册怎么注册常德自助建站seo
  • 网站开发员一月多少工资电子商务系统 网站建设
  • 如何域名解析网站建设第9区在线观看完整版
  • dedecms 如何关闭网站中国网站排行榜
  • 中小企业网站建设与管理课件百度云上上海网站建设设计
  • 做网站网站会怎么样公司网站开发国内外现状
  • 做民宿哪家网站最好免费制作电子请柬app
  • 建设银行官方网站登录百度不收录你的网站产品
  • 有限公司企业网站建设方案马克 扎克伯格大学做的网站
  • 兴宁网站建设互联网营销的优点
  • 如何修改网站logo网站运营内容
  • 佛山附近做网站的公司有哪些鹤壁网站建设
  • 广州外贸公司网站建设台州网站制作系统分析怎么写
  • 网站域名注册人查询静态淘宝网站制作模板
  • 大理公司网站建设网页管理平台
  • 石家庄网站推广方案axrue怎么做网站的原型图
  • 昆明网站seo多少钱同一个服务器可以做多个网站
  • 长沙手机网站建设wordpress网站静态页面
  • 网站开发怎么切换多种语言黄山建设网站公司电话
  • 怎样先做网站后买域名微信做模板下载网站
  • 中航建设集团有限公司网站南宁月嫂网站建设
  • 雨灿网站建设建设网站毕业设计开题报告
  • 泗洪做网站产品推广方案范本
  • 中英文免费网站建设超值的扬中网站建设
  • 上海徐汇网站建设logo制作教程