Что делает аннотация Lombok @RequiredArgsConstructor?

«Что делает аннотация Lombok @RequiredArgsConstructor?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@RequiredArgsConstructor — это аннотация проекта Lombok, которая генерирует конструктор для всех final полей и полей, помеченных @NonNull, во время компиляции. Это сокращает шаблонный код и обеспечивает неизменяемость (immutability) компонентов.

Как работает:

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor // Lombok сгенерирует конструктор
public class OrderService {
    private final OrderRepository orderRepository; // final поле
    private final PaymentService paymentService;   // final поле
    private String optionalField;                  // Не final — не войдет в конструктор

    // Код сгенерированного конструктора:
    // public OrderService(OrderRepository orderRepository, PaymentService paymentService) {
    //     this.orderRepository = orderRepository;
    //     this.paymentService = paymentService;
    // }
}

Преимущества в Spring:

  • Идеально для внедрения зависимостей: Поля final гарантируют, что все зависимости будут проинициализированы при создании бина. Spring автоматически внедряет бины через этот сгенерированный конструктор, что делает @Autowired избыточным.
  • Безопасность потоков: final поля способствуют созданию неизменяемых (thread-safe) бинов.
  • Читаемость: Убирает шаблонный код конструктора.

Альтернативы Lombok: Ручное написание конструктора или использование @Autowired на конструкторе.