Увидимся слишком поздно, аннотации Ломбока, которые архитектор не будет использовать

Java Project Lombok

Оригинал: Не завидуйте мандаринкам или бессмертным, просто долго корректируйте строку кода. Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.

Я видел много оппозицииLombokМои одноклассники тайно добавили плагин сзади, это принцип Zhenxiang. Рот говорит нет, тело честно. Те, кто выступает против этого, должны были никогда не видеть длинного и сложного делового кодекса и все еще погружены в собственный патологический перфекционизм.

Чтобы столкнуться с грязной и грязной рабочей средой, посмотрите правде в глаза.

Lombok избавляет Java от многословия, сокращает длину кода и перемещает фокус туда, где он должен быть. SpringBoot поставил Lombok в свои зависимости, а Java14 даже позаимствовала эту идею и запустилаrecordСинтаксис аналогичен следующему:

record Point(int x, int y) { }

В этой статье не будет обсуждаться что-то похожее на аннотацию @Data. Давайте обсудим более необычную заметку, которая заставляет вас чувствовать, что уже слишком поздно:RequiredArgsConstructor.

Взрывная инъекция свойства

SpringПредоставляет два режима внедрения, о которых также часто спрашивают очень младших программистов.DIнаписание. один属性注入(Полевая инъекция), один через метод установки, другой构造器注入.

Хохо, я солгал, что часто спрашиваютbyNameиbyType. Однако в этом году мы используем больше@Autowiredаннотация.

Код обычно пишется так.

@Service
public class GoodsServiceImpl implements GoodsSrv {
    @Autowired
    private GoodsRepo goodsRepo;
    @Autowired
    private TagRepo tagRepo;
    @Autowired
    private TagRefRepo tagRefRepo;
    @Autowired
    private BrandRepo brandRepo;
    @Autowired
    private UnitRepo unitRepo;
}

Как правило, это нормально, так как вводимые поля ограничены. Но если вы не видели код проекта, вас одурачит видимость совершенства программирования.

Бизнес-код, раскомментированный, и один файл длиной более 2000 строк можно найти везде. Вводимых свойств может достигать дюжины. Эта часть кода инъекции действительно запутана.

Мало того, эти поля также будут выделены серым цветом в среде IDE, говоря вам, что они не инициализированы и код стал уродливым.

Фактически, начиная с Spring 4.0,Не рекомендуется использовать режим внедрения атрибутов, причина в том, что это позволяет нам игнорировать некоторые скрытые опасности того, что код может испортиться. Вы можете сами поискать эту проблему, и мы не будем вдаваться в нее.

Поскольку Spring рекомендует использовать отображаемые методы Setter и Constructor, давайте поменяем реализацию.

Метод Setter в основном используется меньшим количеством людей, потому что он более вонючий и более длительный. Если вы напишете метод set для каждого свойства, я думаю, вы облажаетесь даже с генераторами кода.

Внедрение конструктора

Затем метод конструктора стал нашим первым выбором.

Пример кода выглядит следующим образом:

public class GoodsServiceImpl implements GoodsSrv {

    private GoodsRepo goodsRepo;
    private TagRepo tagRepo;
    private TagRefRepo tagRefRepo;
    private BrandRepo brandRepo;
    private UnitRepo unitRepo;

    public GoodsServiceImpl(
            GoodsRepo goodsRepo,
            TagRepo tagRepo,
            TagRefRepo tagRefRepo,
            BrandRepo brandRepo,
            UnitRepo unitRepo) {
        this.goodsRepo = goodsRepo;
        this.tagRefRepo = tagRefRepo;
        this.tagRefRepo = tagRefRepo;
        this.brandRepo = brandRepo;
        this.unitRepo = unitRepo;
        this.tagRepo = tagRepo;
    }
}

Spring может использовать конструктор для завершения инъекции без добавления других аннотаций. Проблема в том, что нам все еще нужно написать много кода.

В это время вы, возможно, подумали о Ломбоке.AllArgsConstructorаннотация. Но это для всех свойств, если в классе есть какие-то не Bean-свойства, Spring будет сбит с толку.

В это время вы можете использоватьRequiredArgsConstructor.

код показывает, как показано ниже.

@Service
@RequiredArgsConstructor
public class GoodsServiceImpl implements GoodsSrv {
    final GoodsRepo goodsRepo;
    final TagRepo tagRepo;
    final TagRefRepo tagRefRepo;
    final BrandRepo brandRepo;
    final UnitRepo unitRepo;
}

Мы модифицируем свойства, которые необходимо внедрить вfinaltype (или с аннотацией @NotNull, что не рекомендуется), эти свойства будут составлять конструктор по умолчанию. Java требует, чтобы свойства конечного типа были инициализированы, и если нет конструктора, код станет красным.

Мы видим измененную IDE, и раздражающая серая подсказка исчезла.

Такой код очень лаконичен.

немного более продвинутый

В аннотации RequiredArgsConstructor вы также можете написать, как показано ниже. даже поставить@__заменить@_, или замените его на@___, также может нормально работать.

@RequiredArgsConstructor(onConstructor = @__(@Autowired))

Это означает, что к методу конструктора, сгенерированному Lombok, добавьте@Autowiredаннотация. Это синтаксис Lombok насквозь, но теперь Spring не нужно добавлять такие аннотации для запуска.

Посмотрите на мой код ниже, он действительно работает. Вы счастливы?

@RequiredArgsConstructor(onConstructor = 
@______________________________________(
        @Autowired
))

Это ужасно красиво!

End

Таким образом, количество строк кода, которое вы пишете, может резко сократиться. В компании, которая занимается теорией чисел строк кода, это может помочь вам получить 3,25, но эта 3,25 гордится этим.

Эти маленькие хитрости, xjjdog говорит об одном меньше, если вы придете к трехсторонней дружбе, может быть, вы сможете пройти через мои две линии Ren и Du, и вы сможете использовать меньше рекламы и больше галантереи в будущем.

Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.​