JavaRush /Java блог /Random UA /Spring - це не страшно, коротше: Lombok
Павел
11 рівень

Spring - це не страшно, коротше: Lombok

Стаття з групи Random UA
ЗМІСТ ЦИКЛУ СТАТТІВ Трохи Вікіпедії: Ломбо́к (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 , статтю англійською, але перекладач сторінки добре з цим впоратися, зрозуміти сенс можна. У наступній статті продовжимо заповнювати базу.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ