Русский
Русский
English
Статистика
Реклама

Перевод Написание более читаемого кода с помощью Project Lombok

В течение многих лет мы написали на Java много шаблонного кода, такого как методы getter, setter, equals, hashCode и т.д..В некоторых случаях это вызывает проблемы с точки зрения чистого и читаемого кода.

В таких ситуациях Project Lombok спасает нас.Кроме того, с помощью Lombok вы сможете уделять больше времени бизнес-логике.

Фото Фачи Марина на UnsplashФото Фачи Марина на Unsplash

В этом руководстве я расскажу вам о Project Lombok и приведу пример использования Spring Boot.

  • Здесь используются проекты Spring Boot и Spring Data для разработки REST API.

  • Mavenиспользуется для автоматизации процесса сборки.

  • Используется типичный подход к разработке на основе предметной области (domain-driven), разделяющий классы модели, репозитория, сервиса и контроллера.

Вы можете скачать исходный код проекта по этойссылке на GitHub

Что такое Project Lombok?

Я скопировал описание проекта Ломбок отсюда(Официальный сайт).Я не мог бы придумать лучшего предложения, чтобы объяснить это :).Project Lombok - это java-библиотека, которая автоматически подключается к вашему редактору и инструментам сборки, делая вашу java более пикантной.

Фото Канвара на SlideshareФото Канвара на Slideshare

Никогда больше не пишите еще один метод getter или equals, с одной аннотацией ваш класс получает полнофункциональный конструктор, автоматизируется создание переменных журналирования и многое другое.

Project Lombok использует аннотации, чтобы избежать написания шаблонного кода.В некоторых случаях всего пять строк кода могут заменить сотни строк.

Как вы видите ниже, вместо почти восьмидесяти строк кода было использовано несколько аннотаций.

Класс Book, созданный с использование Lombok

package com.medium.libraryinfosystem.model.lombok;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;/** * @author ragcrix */@Data@AllArgsConstructor@NoArgsConstructor@Entity@Tablepublic class Book {    @Id    @GeneratedValue    private Long id;    private String writer;    private String name;    private String genre;    private String year;}

Описание используемых аннотаций согласноLombokJavaDoc:

  • @Data: Создает методы getter для всех полей, метод toString и реализации hashCode и equals, которые проверяют * все не transient поля.Также будет генерировать конструктор, а также методы setter для всех не finalполей.

  • @AllArgsConstructor: Создает конструктор со всеми аргументами.

  • @NoArgsConstructor: Создает конструктор без аргументов.

  • @Slf4j: Заставляет ломбок генерировать поле logger.

Ниже Вы можете увидеть класс модели Book, которая также создана без использования Lombok.

Класс Book, созданный с использование стандартного кода

package com.medium.libraryinfosystem.model.classic;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;import java.util.Objects;/** * @author ragcrix */@Entity@Tablepublic class Book {    @Id    @GeneratedValue    private Long id;    private String writer;    private String name;    private String genre;    private String year;    public Book() {    }    public Book(Long id, String writer,                String name, String genre, String year) {        this.id = id;        this.writer = writer;        this.name = name;        this.genre = genre;        this.year = year;    }    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getWriter() {        return writer;    }    public void setWriter(String writer) {        this.writer = writer;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getGenre() {        return genre;    }    public void setGenre(String genre) {        this.genre = genre;    }    public String getYear() {        return year;    }    public void setYear(String year) {        this.year = year;    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Book book = (Book) o;        return Objects.equals(id, book.id) &&                Objects.equals(writer, book.writer) &&                Objects.equals(name, book.name) &&                Objects.equals(genre, book.genre) &&                Objects.equals(year, book.year);    }    @Override    public int hashCode() {        return Objects.hash(id, writer, name, genre, year);    }    @Override    public String toString() {        return "Book{" +                "id=" + id +                ", writer='" + writer + '\'' +                ", name='" + name + '\'' +                ", genre='" + genre + '\'' +                ", year='" + year + '\'' +                '}';    }}

Project Lombok также обеспечивает удобство ведения журнала следующим образом.Например, вы можете использовать@Slf4jаннотацию для ведения журнала.

Аннотация @ Slf4j используется для ведения журнала

package com.medium.libraryinfosystem.service.impl;import com.medium.libraryinfosystem.model.lombok.Book;import com.medium.libraryinfosystem.repository.BookRepository;import com.medium.libraryinfosystem.service.BookService;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * @author ragcrix */@Slf4j@Servicepublic class BookServiceImpl implements BookService {    @Autowired    private BookRepository bookRepository;    @Override    public Book findByName(String name) {        log.info("inside findByName()");        return bookRepository.findByName(name);    }    @Override    public List<Book> findAll() {        log.info("inside findAll()");        return bookRepository.findAll();    }    @Override    public Book save(Book book) {        log.info("inside save()");        return bookRepository.save(book);    }    @Override    public void delete(Book book) {        log.info("inside delete()");        bookRepository.delete(book);    }}

Как установить Lombok

Мы можем легко интегрировать Lombok в нашу IDE (IntelliJ, Eclipse и т.д.).

В этом разделе я расскажу вам об установке Lombok для IntelliJ Idea.Вы можете перейтисюда,чтобы увидеть другие варианты установки.

  1. Во-первых, вы должны выбрать Lombok при инициализации проекта Spring Boot, как показано ниже.

Инициализация проектаИнициализация проекта

2. После этого, если вы не добавили плагин Lombok в свою IDE раньше, IntelliJ задаст вам вопрос.Вы должны выбрать плагин Lombok и нажать кнопку ОК, чтобы установить плагин в вашу среду IDE.

Установка Lombok Установка Lombok

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

Плагин Lombok установленПлагин Lombok установлен

Информационная система библиотеки

В этом руководстведля кодирования, сборки и тестирования REST APIиспользуютсяIntelliJ IDEA,Maven иPostman.Я работаю вWindows 10с помощью PowerShell.

Все программное обеспечение написано на Java, с использованием Spring 5.2 и Spring Boot 2.2.2, база данных H2 в памяти используется для сохранения данных.

Далее я предполагаю, что у вас установлены JDK 13.0, IntelliJ,Maven и Postman.

Информационная система библиотеки предоставляет информацию о книгах и позволяет добавлять новые книги в систему или удалять книги из системы.

Фото Иво Раиньи на UnsplashФото Иво Раиньи на Unsplash

Моя цель здесь - показать, как использовать Lombok простым способом без перетасовки бизнес-логики.

  • Операция POST используется для добавления книг в систему.

  • Таблицаbookв базе данных H2 в памяти содержит данные о названии каждой книги, авторе, жанре и году.

  • Все, что хранится, получается и возвращается службой, форматируется как JSON.

Модель Book

Эта модель имеет 5 полей: id, name, writer, genre и year.

package com.medium.libraryinfosystem.model.lombok;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;/** * @author ragcrix */@Data@AllArgsConstructor@NoArgsConstructor@Entity@Tablepublic class Book {    @Id    @GeneratedValue    private Long id;    private String writer;    private String name;    private String genre;    private String year;}

Все использованные аннотации Lombok объяснены выше.

Репозиторий Book

Вы можете легко создать интерфейс, расширяющийCrudRepository,с помощью Spring Data Project.При этом нет необходимости реализовывать этот интерфейс :).

package com.medium.libraryinfosystem.repository;import com.medium.libraryinfosystem.model.lombok.Book;import org.springframework.data.repository.CrudRepository;import java.util.List;/** * @author ragcrix */public interface BookRepository extends CrudRepository<Book, Long> {    Book findByName(String name);    List<Book> findAll();    Book save(Book book);    void delete(Book book);}

В BookRepository есть четыре метода.Это простыеоперацииCRUD(создание, чтение, обновление, удаление).

Сервис Book

Сервис Bookимеет четыре метода.Просто эти методы выдают список книг по некоторым критериям, сохраняют или обновляют данные о книге и удаляют книгу.

package com.medium.libraryinfosystem.service;import com.medium.libraryinfosystem.model.lombok.Book;import java.util.List;/** * @author ragcrix */public interface BookService {    Book findByName(String name);    List<Book> findAll();    Book save(Book book);    void delete(Book book);}

Вы можете увидеть реализацию этого интерфейса ниже.

package com.medium.libraryinfosystem.service.impl;import com.medium.libraryinfosystem.model.lombok.Book;import com.medium.libraryinfosystem.repository.BookRepository;import com.medium.libraryinfosystem.service.BookService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;/** * @author ragcrix */@Servicepublic class BookServiceImpl implements BookService {    @Autowired    private BookRepository bookRepository;    @Override    public Book findByName(String name) {        return bookRepository.findByName(name);    }    @Override    public List<Book> findAll() {        return bookRepository.findAll();    }    @Override    public Book save(Book book) {        return bookRepository.save(book);    }    @Override    public void delete(Book book) {        bookRepository.delete(book);    }}

Book контроллер

BookController.java- это класс REST контроллера, который имеет два методас аннотацией @GetMapping,один с @PostMappingи один с@DeleteMapping.

package com.medium.libraryinfosystem.controller;import com.medium.libraryinfosystem.dto.BookDTO;import com.medium.libraryinfosystem.model.lombok.Book;import com.medium.libraryinfosystem.service.BookService;import com.medium.libraryinfosystem.util.ObjectMapperUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.*;import java.util.List;/** * @ragcrix */@RestController@RequestMapping("/books")public class BookController {    @Autowired    private BookService bookService;    @GetMapping(value = "/")    public List<BookDTO> getAllBooks() {        return ObjectMapperUtils.mapAll(bookService.findAll(), BookDTO.class);    }    @GetMapping(value = "/byName/{bookName}")    public BookDTO getBookByName(@PathVariable("bookName") String bookName) {        return ObjectMapperUtils.map(bookService.findByName(bookName), BookDTO.class);    }    @PostMapping(value = "/save")    public ResponseEntity<?> saveOrUpdateBook(@RequestBody BookDTO bookDTO) {        bookService.save(ObjectMapperUtils.map(bookDTO, Book.class));        return new ResponseEntity("Book added successfully", HttpStatus.OK);    }    @DeleteMapping(value = "/delete/{bookName}")    public ResponseEntity<?> deleteBookByName(@PathVariable String bookName) {        bookService.delete(bookService.findByName(bookName));        return new ResponseEntity("Book deleted successfully", HttpStatus.OK);    }}

Конфигурация базы данных

Чтобы подключиться к базе данных H2, отредактируйте настройки вфайлеapplication.properties,который расположен в директори resources.Достаточно следующей конфигурации.

# Serverserver.port=9090# Enabling H2 Consolespring.h2.console.enabled=true# Datasourcespring.datasource.url=jdbc:h2:mem:testdbspring.datasource.driverClassName=org.h2.Driverspring.datasource.username=saspring.datasource.password=# JPAspring.jpa.show-sql=truespring.jpa.generate-ddl=truespring.jpa.database-platform=org.hibernate.dialect.H2Dialect

После запуска информационной системы библиотеки вы можете легко получить доступ к базе данных H2 по этойссылке.

Примечание. Каждый раз, когда запускается этот проект, будут выполняться скрипт в файле data.sql, который находится в директории resources.Конечно, для этого используется Spring Data.

insert into book values(1, 'SCI-FI', 'Frankenstein', 'Mary Shelley', '1818'); insert into book values(2, 'Fantastic', 'Harry Potter', 'J. K. Rowling', '1997');

Запуск службы и тестирование с помощью Postman

Вы можете легко запустить этот проект для тестирования службы REST.

Если вы хотите добавить книгу в информационную систему библиотеки, вы можете использоватьфайл data.jsonв корне проекта.

Запустите проект в IntelliJЗапустите проект в IntelliJ

После запуска проекта вы можете протестировать службу REST.Для этого откройте Postman, введите URL-адрес и выберитеметодGET,какпоказанониже.

Список книгСписок книг

Снова введите ссылку с названием книги в базу данных.

ФранкенштейнФранкенштейн

Вы можете добавить книгу в систему с помощьюметодаPOSTв Postman.Сначала вы должны ввестипару ключ-значение заголовкаContent-Type:application/json.Во-вторых, во вкладке body вы должны ввести информацию о книге, которую вы хотите сохранить в базе данных в формате JSON.

Добавление книгиДобавление книги

Если вы хотите удалить книгу, вам следует выбратьметодDELETEв Postman и добавить название книги, которую вы хотите удалить, в конец ссылки.

Удаление книгиУдаление книги

Ресурсы

Примечание. Вэтом руководстве рассматривается сочетание Spring Data, H2 в памяти и REST API.В проекте нет проверки для полей объекта.

Спасибо за прочтение!Ваши мысли очень ценны для меня.Пожалуйста, поделитесь.

Источник: habr.com
К списку статей
Опубликовано: 17.10.2020 18:18:02
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Java

Spring-boot

Lombok

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru