Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки. Любое воспроизведение, которое не содержит этого утверждения, является плагиатом.
За эти годы я много написал на Java и чувствую, что Java становится все уродливее. Особенно после того, как я поигрался с TypeScript, меня всегда тошнит, когда я вижу код Java. Это изменение мышления доказывает со стороны, что я не целеустремленный человек.
Потому что я собака.
Набор систем с открытым исходным кодом для учебных целей, добро пожаловать в звезду:GitHub.com/star hotel о, хорошо/неплохо…. Он включает в себя сложный бизнес ToB, бизнес с высокой степенью параллелизма в Интернете, приложение кэширования, DDD, руководство по микросервисам. Управляемый моделью, управляемый данными. Поймите путь эволюции крупномасштабных сервисов, навыки кодирования, изучите Linux и настройте производительность. Помощь Docker/k8s, мониторинг, сбор логов, изучение промежуточного ПО. Front-end технология, back-end практика и т.д. Основная техника:
SpringBoot+JPA+Mybatis-plus+Antd+Vue3.
В моей природе любить новое и ненавидеть старое, даже если я выражаюсь очень чисто.
Само собой разумеется, что персонажам Niu X не нужно сосредотачиваться на проблемах более низкого уровня, таких как уровень языка. Однако, на каком бы языке это ни было, копирование различных атрибутов — это проблема, которой в инженерии не избежать. например бросать людейVO,BO,DTO,DOЖдать.
Шестьдесят процентов кода в проекте выполняют эти бесполезные преобразования и различные проверки данных. Я просто шучу насчет этого соотношения, но оно почти такое же.
В Java существует три способа обработки этих копий свойств:
- непосредственный
硬код, жесткий код - использовать различные
BeanUtils, задание выполняется отражением - использовать что-то вроде
MapStructинструмент, который выполняется непосредственно во время компиляции
На самом деле, у каждого из них есть свои плюсы и минусы.Хотя некоторые вещи и пахнут, вам все равно нужно думать о них, когда вы их на самом деле используете. Все они наряжены и выпендриваются, все это внешние скины.
В этой статье в основном рассказывается об использовании Mapstruct, и от этого ароматного инструмента чувствуется запах того, как он становится прогорклым.
Как пользоваться?
Как обычно, вам нужно добавить пакеты зависимостей в pom, мы используем здесь1.4.1.FinalВерсия.
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
Это еще не конец, вам еще нужно добавить плагин в раздел сборки файла pom. Он такой сложный, потому что его принцип тот же, что и у ломбока, и он тоже реализуется в компиляторе через APT.
Это означает, что его код завершается во время компиляции. Отражение не требуется, поэтому эффективность такая же, как при непосредственном написании get и set.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
В настоящее время мы можем использовать аннотации, которые он предоставляет, чтобы легко копировать атрибуты.
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface Transform {
Transform T = Mappers.getMapper(Transform.class);
Member fromMemberEntity(MemberEntity entity);
MemberEntity fromMember(Member member);
}
Выше приведен пример кода. Аннотация Mapper указывает, что это инструмент преобразования типов (сопоставитель объектов), который предоставляет нам множество стратегий на выбор. Напишите файл интерфейса напрямую, никаких дополнительных действий не требуется, mapstruct знает, что вы хотите сделать!
В традиционном программировании, если есть много атрибутов участника, нам нужно выполнить этот процесс вручную, и код будет очень большим.
После использования Mapperstruct эта часть повторяющейся работы и инструментов сделана за нас.
Посмотрите на картинку ниже!
На приведенном выше рисунке видно, что код генерируется в каталоге generate-source под таргетом, что является заслугой плагина, который мы добавили выше; содержание кода на самом деле представляет собой какие-то непустые суждения и получить, установить и т. д. Атрибуты одного типа с одинаковым именем поля будут скопированы без разбора.
Если у вас много свойств бина, этот инструмент уменьшит ваш код с нескольких сотен строк до нескольких строк!
2. Сравнение с другими методами
Каковы преимущества того, что mapstruct это? Почему бы просто не использовать BeanUtils? Как их эффекты ах, и последний предоставил различные библиотеки.
Основная причина является эффективностью.
BeanUtils реализован через рефлексию, и эффективность однозначно низкая, а mapstuct реализован на основе APT, и потери производительности нет.
Копия атрибута BeanUtils имеет много препятствий при оценке нулевых значений и различных типов атрибутов и перестанет есть; в то время как mapstruct имеет очень гибкие стратегии и методы преобразования, и более настраиваема (будет рассмотрено позже).
3. Сложная сцена
Теперь давайте рассмотрим сложный сценарий.
Если ваш bean-компонент имеет только некоторые общие свойства, то использование mapstruct будет очень удобным. Но всегда есть исключения, которые требуют более сложной обработки.
Предположим, я хочуUnitпревратиться вProductUnitEntity, но одно из полейmeasureTypeОни бывают разных типов, мы можем использоватьMappingsАннотация завершает это преобразование.
@Mappings({
@Mapping(source = "measureType.value", target = "measureType")
})
ProductUnitEntity fromUnit(Unit v);
Скомпилированный код показан ниже. С исходным и целевым кодом вы можете добиться более удивительного поведения, чем BeanUtils. Вы даже можете пройтиdateFormatСделайте какое-нибудь преобразование даты или что-то в этом роде.
На самом деле вышеизложенноеmeasureTypeТип перечисления. Как преобразовать обычные типы в типы перечислений? Нам нужно только предоставить метод по умолчанию, и все в порядке. MapStruct будет определять тип параметра и возвращаемое значение, поэтому название метода может быть любым юридическим значением.
default Unit.MeasureType measureTypeIntegerToDomain(Integer value) {
for (Unit.MeasureType s : Unit.MeasureType.values()) {
if (s.getValue() == value) {
return s;
}
}
return null;
}
Может ли mapstruct реализовать преобразование между списками? это тоже хорошо. Следующие две строки кода могут автоматически дополнять цикл for, чтобы сделать ваш код более кратким.
List<StockKeepingUnit> fromSkuEntityList(List<StockKeepingUnitEntity> v);
List<StockKeepingUnitEntity> fromSkuList(List<StockKeepingUnit> v);
End
Итак, вот в чем проблема.
Раз это так хорошо, то почему сейчас многие проекты не используют mapstruct, даже BeanUtils, а получают и устанавливают их там вручную?
Одна из причин заключается в том, что эти инструменты значительно сокращают объем кода.mapstruct+hibernate-validate, один управляет преобразованием, а другой управляет проверкой, что является просто кошмаром для компаний, которые полагаются на количество строк кода. Производительность снизится!
Другая причина - использовать эти инструменты иНеблагоприятный рефакторинг проекта. Если вы поместите в DTOaполе изменено наbполя, mapstruct贴心для тебя忽略Эти изменения. Код вашего проекта не будет вызывать ошибок, риск будет перенесен непосредственно во время выполнения.
С помощью метода Get и Set, в дополнение к большому количеству изменений кода, единственный риск заключается в том, что разработчик забывает назначить значение новым полем.
В этом случае работа, выполняемая машиной, не обязательно более надежна, чем работа человека. так что используйтеmapstructЕсть большая предпосылка: ваша команда может принять соглашение, не называть переменные без разбора и не проводить рефакторинг без разбора. Только так можно реализовать его ценность.
Набор систем с открытым исходным кодом для учебных целей, добро пожаловать в звезду:GitHub.com/star hotel о, хорошо/неплохо…. Он включает в себя сложный бизнес ToB, бизнес с высокой степенью параллелизма в Интернете, приложение кэширования, DDD, руководство по микросервисам. Управляемый моделью, управляемый данными. Поймите путь эволюции крупномасштабных сервисов, навыки кодирования, изучите Linux и настройте производительность. Помощь Docker/k8s, мониторинг, сбор логов, изучение промежуточного ПО. Front-end технология, back-end практика и т.д. Основная техника:
SpringBoot+JPA+Mybatis-plus+Antd+Vue3.
Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.