Из 12 методов vo2dto данные измерения давления BeanUtil.copyProperties являются наиболее растянутыми!

задняя часть внешний интерфейс GitHub контрольная работа
Из 12 методов vo2dto данные измерения давления BeanUtil.copyProperties являются наиболее растянутыми!

⚠️ Эта статья является первой подписанной статьей сообщества Nuggets, и её перепечатка без разрешения запрещена.

Автор: Брат Сяофу
Блог:bugstack.cn

Осаждайте, делитесь, растите и позвольте себе и другим что-то получить! 😄

Введение

为哈么,你的代码也就仅仅是能用而已?

Как писать код без технической глубины, без запаса знаний и без накопления опыта? Baidu, если вы столкнулись с проблемой, поищите немного, затем проверьте кусок, независимо от того, какой это принцип или для какой сцены он подходит, сначала вставьте его в свой собственный проект,Смотри, ты можешь бежать, ты можешь бежать. Тогда такой код доводится только до пригодного для использования уровня, и никакой определенной гарантии качества вообще нет, не говоря уже о структурах данных, алгоритмической логике и шаблонах проектирования.LeetCode, очищенный от программных данных, которые вы видите, полностью не работает.

Что вы говорите, когда чувствуете, что прочитали много информации и не можете ею воспользоваться?真卷,都学到这样了. Но на самом деле я не ощутил всю глубину технологии раскопок, кардинга полного спектра знаний, немного тяжелого немного урожаянаходится в объеме. Наоборот, посмотреть техническое видео так же просто, как посмотреть фильм: если не пишешь кейс, думаешь, что можешь прочитать книгу.

Точно так же, как если бы вы использовали инструмент копирования свойства, поместитеvo转成dto, какой из них вы используете, это Apache или Spring, или что-то еще, что является наиболее эффективным?Далее давайте проверим это на данных и сравним использование различных случаев

Во-вторых, сравнение тестов производительности

В процессе разработки инженерной системы Java система будет преобразование объекта между различными слоями, такими как VO, DTO, PO, VO и т. Д., А если все это ручнойget、setЭто слишком пустая трата времени, также можно использовать ошибку, поэтому выберите инструмент автоматизации более удобным.

На данный момент я разобрал 12 типов преобразования свойств объекта, в том числе: обычный getset, json2Json, копирование свойств Apache, копирование свойств Spring, bean-mapping, bean-mapping-asm, BeanCopier, Orika, Dozer, ModelMapper, JMapper, MapStruct. Затем мы тестируем эти 11 операций преобразования атрибутов соответственно в一百次,一千次,一万次,十万次,一百万次Сравнение времени производительности.

  • BeanUtils.copyPropertiesЭто самый распространенный инструментальный класс в коде каждого, но до тех пор, пока вы не используете его неправильно.ApacheУпакованный, но предоставленный Spring, он в основном не окажет большого влияния на производительность.
  • Но если производительность лучше, альтернатива ручномуget、setда, ещеMapStructЛучше использовать, потому что он генерируется во время компиляции.get、setкод, и мы пишемget、setТакой же.
  • Некоторые другие пакеты компонентов в основном основаны наAOP,ASM,CGlib, технические средства для достижения, поэтому будет соответствующая потеря производительности.

3. 12 конверсионных кейсов

исходный код:GitHub.com/заместитель комиссара/…

описывать: Создайте пакет interfaces.assembler в рамках кейс-проекта, определитеIAssembler<SOURCE, TARGET>#sourceToTarget(SOURCE var)Интерфейс, предоставляющий различные методы реализации класса операций преобразования объектов, можно напрямую загружать, запускать и отлаживать в процессе обучения.

1. get\set

@Component
public class GetSetAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId(var.getUserId());
        userDTO.setUserNickName(var.getUserNickName());
        userDTO.setCreateTime(var.getCreateTime());
        return userDTO;
    }

}
  • рекомендовать: ★★★☆☆
  • представление: ★★★★★
  • означает:почерк
  • Отзывы: На самом деле, этот метод также наиболее часто используется в повседневной жизни.Производительность, безусловно, отличная, но работать с ним немного хлопотно. Особенно, когда объект VO с большим количеством свойств преобразуется в объект DTO. Но на самом деле есть и несколько быстрых способов работы, например, можно выделить все атрибуты через Shift+Alt, объединить их в одну колонку с помощью Shift+Tab, а затем с помощью Alt выделить эту колонку и выполнить пакетную операцию вставки.userDTO.setИ клавиша быстрого доступа делает первую букву атрибута заглавной, и, наконец, переключается на закрывающие скобки и точки с запятой, и, наконец, выполняется форматирование.

2. json2Json

@Component
public class Json2JsonAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        String strJson = JSON.toJSONString(var);
        return JSON.parseObject(strJson, UserDTO.class);
    }

}
  • рекомендовать: ☆☆☆☆☆
  • представление: ★☆☆☆☆
  • означает: преобразовать объект в строку JSON, а затем преобразовать JSON в другой объект.
  • Отзывы: Писать так, наверное, немного жжёт!

3. Apache copyProperties

@Component
public class ApacheCopyPropertiesAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        UserDTO userDTO = new UserDTO();
        try {
            BeanUtils.copyProperties(userDTO, var);
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
        return userDTO;
    }

}
  • рекомендовать: ☆☆☆☆☆
  • представление: ★☆☆☆☆
  • означает: Механизм Introspector получает свойства класса для операций присваивания.
  • Отзывы: Есть ямки, совместимость нарушена, не рекомендуется использовать

4. Spring copyProperties

@Component
public class SpringCopyPropertiesAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        UserDTO userDTO = new UserDTO();
        BeanUtils.copyProperties(var, userDTO);
        return userDTO;
    }

}
  • рекомендовать: ★★★☆☆
  • представление: ★★★★☆
  • означает: Механизм Introspector получает свойства класса для операций присваивания.
  • Отзывы: Это также копия отраженного свойства. CopyProperties, предоставляемые Spring, намного проще в использовании, чем Apache. Пока вы не делаете ошибок, проблем в принципе не будет.

5. Bean Mapping

@Component
public class BeanMappingAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        UserDTO userDTO = new UserDTO();
        BeanUtil.copyProperties(var, userDTO);
        return userDTO;
    }

}
  • рекомендовать: ★★☆☆☆
  • представление: ★★★☆☆
  • означает: копия атрибута
  • Отзывы: Общие показатели

6. Bean Mapping ASM

@Component
public class BeanMappingAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        UserDTO userDTO = new UserDTO();
        BeanUtil.copyProperties(var, userDTO);
        return userDTO;
    }

}
  • рекомендовать: ★★★☆☆
  • представление: ★★★★☆
  • означает: реализовано на основе фреймворка байт-кода ASM.
  • Отзывы: По сравнению с обычным Bean Mapping, производительность улучшилась, его можно использовать.

7. BeanCopier

@Component
public class BeanCopierAssembler implements IAssembler<UserVO, UserDTO> {

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        UserDTO userDTO = new UserDTO();
        BeanCopier beanCopier = BeanCopier.create(var.getClass(), userDTO.getClass(), false);
        beanCopier.copy(var, userDTO, null);
        return userDTO;
    }

}
  • рекомендовать: ★★★☆☆
  • представление: ★★★★☆
  • означает: создание методов получения и установки на основе операций с байт-кодом CGlib.
  • Отзывы: Общая производительность очень хорошая, несложная в использовании, вы можете использовать

8. Orika

@Component
public class OrikaAssembler implements IAssembler<UserVO, UserDTO> {

    /**
     * 构造一个MapperFactory
     */
    private static MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();

    static {
        mapperFactory.classMap(UserDTO.class, UserVO.class)
                .field("userId", "userId")  // 字段不一致时可以指定
                .byDefault()
                .register();
    }

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        return mapperFactory.getMapperFacade().map(var, UserDTO.class);
    }

}
  • Официальный сайт:orika-mapper.github.io/orika-docs/
  • рекомендовать: ★★☆☆☆
  • представление: ★★★☆☆
  • означает: Генерировать отображение объектов на основе Bytecode
  • Отзывы: Производительность теста не слишком заметна.Если вы его используете, вам нужно оптимизировать построение MapperFactory в объект Bean

9. Dozer

@Component
public class DozerAssembler implements IAssembler<UserVO, UserDTO> {

    private static DozerBeanMapper mapper = new DozerBeanMapper();

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        return mapper.map(var, UserDTO.class);
    }

}
  • Официальный сайт:dozer.source forge.net/document ATI…
  • рекомендовать: ★☆☆☆☆
  • представление: ★★☆☆☆
  • означает: Структура сопоставления атрибутов, рекурсивное копирование объектов.
  • Отзывы: Производительность немного плохая, не рекомендуется использовать

10. ModelMapper

@Component
public class ModelMapperAssembler implements IAssembler<UserVO, UserDTO> {

    private static ModelMapper modelMapper = new ModelMapper();

    static {
        modelMapper.addMappings(new PropertyMap<UserVO, UserDTO>() {
            @Override
            protected void configure() {
                // 属性值不一样可以自己操作
                map().setUserId(source.getUserId());
            }
        });
    }

    @Override
    public UserDTO sourceToTarget(UserVO var) {
        return modelMapper.map(var, UserDTO.class);
    }

}
  • Официальный сайт:modelmapper.org
  • рекомендовать: ★★★☆☆
  • представление: ★★★☆☆
  • означает: На основе реализации байт-кода ASM
  • Отзывы: Производительность хорошая, когда количество конвертируемых объектов небольшое.Если объекты конвертируются одновременно большими пакетами, производительность снижается.

11. JMapper

JMapper<UserDTO, UserVO> jMapper = new JMapper<>(UserDTO.class, UserVO.class, new JMapperAPI()
        .add(JMapperAPI.mappedClass(UserDTO.class)
                .add(JMapperAPI.attribute("userId")
                        .value("userId"))
                .add(JMapperAPI.attribute("userNickName")
                        .value("userNickName"))
                .add(JMapperAPI.attribute("createTime")
                        .value("createTime"))
        ));
  • Официальный сайт:GitHub.com/ просто картограф - раздражает...
  • рекомендовать: ★★★★☆
  • представление: ★★★★★
  • означает: Элегантность, высокая производительность и надежность в одном средстве сопоставления java bean
  • Отзывы: Скорость действительно хорошая, но в сочетании с SpringBoot чувствуется немного хлопотно, возможно, поза неправильная.

12. MapStruct

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE)
public interface UserDTOMapping extends IMapping<UserVO, UserDTO> {

    /** 用于测试的单例 */
    IMapping<UserVO, UserDTO> INSTANCE = Mappers.getMapper(UserDTOMapping.class);

    @Mapping(target = "userId", source = "userId")
    @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Override
    UserDTO sourceToTarget(UserVO var1);

    @Mapping(target = "userId", source = "userId")
    @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Override
    UserVO targetToSource(UserDTO var1);

}
  • Официальный сайт:GitHub.com/карта структура/но…
  • рекомендовать: ★★★★★
  • представление: ★★★★★
  • означает: генерировать соответствующий get и set непосредственно во время компиляции, как написанный от руки код.
  • Отзывы: Скорость очень высокая, не нужно обрабатывать во время выполнения, легко использовать в сочетании с фреймворком.

4. Резюме

  • По сути, операция преобразования атрибутов объекта — не что иное, как обработка на основе рефлексии, АОП, CGlib, ASM, Javassist во время компиляции и во время выполнения, и хорошей идеей является генерация соответствующих get и set перед компиляцией, прямо как рукописный. .
  • Поэтому я рекомендую MapStruct, который мне нравится, более удобный в использовании.Одним из них является функциональное расширение, простота использования и совместимость.
  • Независимо от того, какое использование, вы должны провести полную проверку и проверку, не копировать и не вставлять, когда вы подходите, иначе вы можете выкопать яму раньше, конечно, это не обязательно брат, который заполняет яму.