Ответ
В последнем проекте использовался IoC-контейнер Spring Framework для реализации Dependency Injection (DI).
Как это работает: Spring создает и управляет объектами (бинами), автоматически внедряя их зависимости, вместо того чтобы объекты создавали их сами.
Основные механизмы внедрения:
-
Внедрение через конструктор (рекомендуется)
@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; } }- Плюсы: Неизменяемость зависимостей, явное объявление, удобство тестирования.
-
Внедрение через поле (менее предпочтительно, но встречается)
@Service public class UserService { @Autowired // Внедрение зависимости прямо в поле private UserRepository userRepo; }
Ключевые аннотации:
@Component,@Service,@Repository,@Controller— помечают класс как бин.@Autowired— запрашивает внедрение зависимости (можно над конструктором, полем или сеттером).@Configurationи@Bean— для програмного объявления бинов.@Qualifier("beanName")— уточняет, какой конкретно бин внедрить, если есть несколько кандидатов одного типа.
Преимущества Spring DI:
- Слабая связанность: Классы не зависят от конкретных реализаций, а от абстракций (интерфейсов).
- Упрощение тестирования: Зависимости легко подменить моками в unit-тестах.
- Централизованное управление: Конфигурация и жизненный цикл всех компонентов в одном месте.