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 Уровень 22, Санкт-Петербург, Россия
30 июля 2021
Для entity лучше не использовать @Data, а заменять ее на @Setter и @Getter, т.к. @Data также переопределяет toString() и hashCode(), и с хеш-кодом могут возникнуть проблемы, если entity будет иметь коллекции и связи с другими entity.
Роман Уровень 24, Ижевск, Россия
18 декабря 2020
Норм статья, для тех кто не знаком с lombok, даст хотя б поверхностное понимание для чего он, как работает, а углубленные знания найдут сами уже
Vladimir Уровень 40, Эстония Master
18 декабря 2020
Lobok не везде нужен. В некоторых случаях это просто зло.
Vladimir Уровень 40, Эстония Master
18 декабря 2020
Во и Павлодар, как всегда фигачит статьи, которые никто не читает, без выходных и праздничных.