Какую систему инверсии управления и внедрения зависимостей (IoC/DI) вы использовали в последнем проекте?

«Какую систему инверсии управления и внедрения зависимостей (IoC/DI) вы использовали в последнем проекте?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В последнем проекте использовался IoC-контейнер Spring Framework для реализации Dependency Injection (DI).

Как это работает: Spring создает и управляет объектами (бинами), автоматически внедряя их зависимости, вместо того чтобы объекты создавали их сами.

Основные механизмы внедрения:

  1. Внедрение через конструктор (рекомендуется)

    @Service
    public class OrderService {
        private final PaymentService paymentService; // Зависимость объявлена как final
        private final NotificationService notificationService;
    
        // Spring автоматически найдет и внедрит подходящие бины
        public OrderService(PaymentService paymentService, NotificationService notificationService) {
            this.paymentService = paymentService;
            this.notificationService = notificationService;
        }
    }
    • Плюсы: Неизменяемость зависимостей, явное объявление, удобство тестирования.
  2. Внедрение через поле (менее предпочтительно, но встречается)

    @Service
    public class UserService {
        @Autowired // Внедрение зависимости прямо в поле
        private UserRepository userRepo;
    }

Ключевые аннотации:

  • @Component, @Service, @Repository, @Controller — помечают класс как бин.
  • @Autowired — запрашивает внедрение зависимости (можно над конструктором, полем или сеттером).
  • @Configuration и @Bean — для програмного объявления бинов.
  • @Qualifier("beanName") — уточняет, какой конкретно бин внедрить, если есть несколько кандидатов одного типа.

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

  • Слабая связанность: Классы не зависят от конкретных реализаций, а от абстракций (интерфейсов).
  • Упрощение тестирования: Зависимости легко подменить моками в unit-тестах.
  • Централизованное управление: Конфигурация и жизненный цикл всех компонентов в одном месте.