⚠️ Эта статья является первой подписанной статьей сообщества 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, который мне нравится, более удобный в использовании.Одним из них является функциональное расширение, простота использования и совместимость.
- Независимо от того, какое использование, вы должны провести полную проверку и проверку, не копировать и не вставлять, когда вы подходите, иначе вы можете выкопать яму раньше, конечно, это не обязательно брат, который заполняет яму.