JavaRush/Java блог/Java Developer/Spring – это не страшно, короче: Lombok
Павел
11 уровень

Spring – это не страшно, короче: Lombok

Статья из группы Java Developer
участников
СОДЕРЖАНИЕ ЦИКЛА СТАТЕЙ Немного Википедии: Ломбо́к (Lombok с индон. — «перец чили») — остров в Малайском архипелаге, в группе Малых Зондских островов, в составе Индонезии. Lombok названа популярная библиотека для языка программирования Java. Выбор названия связан с тем, что остров Ломбок находится не так далеко от острова Ява, а также, видимо, со значением его названия "перец чили", поскольку библиотека предоставляет полезные "приправы" для языка. Лучше и не скажешь, да и к чему слова, давайте посмотрим его в деле: Установите плагин. В блок <dependencies> pom файла добавляем зависимость:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
Понеслась: Откройте проект из прошлой статьи, откройте class FruitEntity.
package ru.java.rush.entities;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Entity
@Table(name = "fruit_table")
public class FruitEntity {

    @Id
    @Column(name = "id_fruit")
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    private Integer id;

    @Column(name = "fruit_name")
    private String fruitName;

    @Column(name = "provider_code")
    private Integer providerCode;

//чтобы с классом можно было совершать манипуляции создается
//пустой конструктор, геттеры, сеттеры, конструктор и переопределяется метод toString()

public FruitEntity(){

}


public Integer getId() {
    return id;
}

public FruitEntity setId(Integer id) {
    this.id = id;
    return this;
}

public String getFruitName() {
    return fruitName;
}

public FruitEntity setFruitName(String fruitName) {
    this.fruitName = fruitName;
    return this;
}

public Integer getProviderCode() {
    return providerCode;
}

public FruitEntity setProviderCode(Integer providerCode) {
    this.providerCode = providerCode;
    return this;
}

@Override
public String toString() {
    return "FruitEntity{" +
            "id=" + id +
            ", fruitName='" + fruitName + '\'' +
            ", providerCode=" + providerCode +
            '}';
}
Длинноват, не правда ли? Повесим на класс аннотацию @Data от Ломбока и посмотрим как это сократит код.
package ru.java.rush.entities;

import lombok.Data;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Data//аннотация сгенирует при компиляции необходимый код
@Entity
@Table(name = "fruit_table")
public class FruitEntity {

    @Id
    @Column(name = "id_fruit")
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    private Integer id;

    @Column(name = "fruit_name")
    private String fruitName;

    @Column(name = "provider_code")
    private Integer providerCode;

//и все! Весь остальной код будет сгенирован Ломбоком
Запустите проект, проверьте что все работает. Теперь по смотрим как с помощью Lombok можно внедрять зависимость. Откроем для примера class FruitService, повесим на класс @RequiredArgsConstructor и удалим конструктор из класса, он нам больше не нужен.
package ru.java.rush.services;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.java.rush.entities.FruitEntity;
import ru.java.rush.repositories.FruitRepository;

import java.util.List;


@Service
@RequiredArgsConstructor//аннотация от Ломбок
public class FruitService {

    private final FruitRepository fruitRepository;

//здесь когда то был конструктор

    public Optional<FruitEntity> getById(Integer id) {
        return fruitRepository.findById(id);
    }

    public void delById(Integer id) {
        fruitRepository.deleteById(id);
    }

    public Boolean exist(Example<? extends FruitEntity> example) {
        return fruitRepository.exists(example);
    }

    public void save(FruitEntity fruitEntity) {
        fruitRepository.save(fruitEntity);
    }

    public List<FruitEntity> getAll() {
        return fruitRepository.findAll();
    }

    public void saveAll(List<FruitEntity> fruits) {
        fruitRepository.saveAll(fruits);
    }
Теперь тем же способом избавьтесь от лишнего кода в классе InitiateUtils. Проверьте что все работает. По ходу этого проекта, мы используем еще несколько новых аннотаций Ломбока. UPD: Хороший комментарий от Denis Ryabchikov "Для entity лучше не использовать @Data, а заменять ее на @Setter и @Getter, т.к. @Data также переопределяет toString() и hashCode(), и с хеш-кодом могут возникнуть проблемы, если entity будет иметь коллекции и связи с другими entity." В принципе и все, вот статья по Ломбоку в ней посмотрите описание аннотаций: @Data, @Value, @RequiredArgsConstructor и @Builder. В этой статье почитайте про @ Accessors, статья на английском, но переводчик страницы хорошо с этим справиться, понять смысл можно. В следующей статье продолжим наполнять базу.
Комментарии (14)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Denis Ryabchikov Backend Developer
30 июля 2021, 14:21
Для entity лучше не использовать @Data, а заменять ее на @Setter и @Getter, т.к. @Data также переопределяет toString() и hashCode(), и с хеш-кодом могут возникнуть проблемы, если entity будет иметь коллекции и связи с другими entity.
Василий Бабин Мракоборец в Дурмстранг Expert
4 августа 2021, 16:23
Ага, бесконечный цикл. В данном случае, рекомендуют переопределить toString() вручную. Про hashCode() пока не слышал (но, у меня опыта маловато).
Сергей Java Developer в Сбер Expert
10 февраля 2022, 00:02
чтобы не было циклицеских методов можно использовать @ToString.Exclude @EqualsAndHashCode.Exclude моя статья про lombok https://javarush.com/groups/posts/2753-biblioteka-lombok
Василий Бабин Мракоборец в Дурмстранг Expert
10 февраля 2022, 11:29
Да, опробовал. Но, это так себе решение, лучше прописать руками. А, так это просто убирает поле из вывода.
Person(name=Иван, age=26, cat=Cat(name=Мурка, age=3))
Cat(name=Мурка, age=3)
Если нам не важно кто хозяин, то нормально, но всё же лучше получить полную информацию.
Роман
Уровень 24
18 декабря 2020, 18:57
Норм статья, для тех кто не знаком с lombok, даст хотя б поверхностное понимание для чего он, как работает, а углубленные знания найдут сами уже
Vladimir
Уровень 40
Master
18 декабря 2020, 08:32
Lobok не везде нужен. В некоторых случаях это просто зло.
Justinian Judge в Mega City One Master
18 декабря 2020, 08:45
Lombock, как и любая технология в джаве или конструкция, как лекарство. Оно помогает если использовать там где нужно. И может нанести вред, если использовать там где не нужно :)
Vladimir
Уровень 40
Master
18 декабря 2020, 08:46
Дык я и про тоже. Не везде это лекарство во благо.
Vladimir
Уровень 40
Master
18 декабря 2020, 08:27
Во и Павлодар, как всегда фигачит статьи, которые никто не читает, без выходных и праздничных.
Павел
Уровень 11
18 декабря 2020, 08:34
Владимир, вы же читаете, и постоянно комментируете, бывает только потом коменты свои удаляете, без выходных и праздничных, это очень меня мотивирует
Vladimir
Уровень 40
Master
18 декабря 2020, 08:42
Можно на ты. Все мы тут (в программировании) на ты.
Vladimir
Уровень 40
Master
18 декабря 2020, 08:43
Да, не спорю. Удаляю, потому, как считаю, что чуток жестко накоментил. Не стоит так жестко коментить. Я про то, что начни писать статьи эти свои на такие блоги, как: JavaDeveloperZone, JournalDev, SpringFramework.guru. Просто попробуй и ты услышишь куда они тебя пошлют. Я к тому, что почему ты считаешь, что на JavaRush можно писать все, что тебе приснилось? А пофигу, пиши, что хочешь.
Hanna Moruga Chief editor @ JavaRush
18 декабря 2020, 09:24
Владимир, раздел "Статьи" на JavaRush - это не наше эксклюзивное медиа или "блог компании": это площадка для обмена мнениями, опытом и знаниями от участников нашего сообщества. Некоторым людям легче закреплять знания путем написания статей. Комментарии по содержанию материала (где исправить, что добавить, что улучшить) - только в плюс и для автора, и для читателей. Возможно, поэтому Павел и решил публиковать статьи здесь, а не на озвученных вами площадках: на JavaRush люди активно помогают друг другу (в мягкой или жесткой форме - тут уже зависит от каждого), что нам самим нравится)
Vladimir
Уровень 40
Master
18 декабря 2020, 09:32
Да нет проблем, от слова ВООБЩЕ.