Вопрос проверяет понимание Dependency Injection и принципов проектирования надёжных компонентов.
Constructor injection гарантирует, что объект создаётся сразу в корректном состоянии. Все зависимости обязательны и не могут быть забыты. Такой подход упрощает тестирование и делает объект неизменяемым. Он также позволяет раньше выявлять ошибки конфигурации. Поэтому Spring рекомендует именно этот способ.
Constructor injection — это внедрение зависимостей через конструктор класса.
@Component
class UserService {
private final UserRepository repository;
UserService(UserRepository repository) {
this.repository = repository;
}
}
Перед началом работы важно понять, какие проблемы он решает.
объект не может быть создан без зависимостей
исключается null
инварианты класса соблюдены
легко подменять зависимости в тестах
не нужен Spring-контейнер для unit-тестов
new UserService(mockRepository);
зависимости можно сделать final
объект становится thread-safe при stateless-дизайне
@Field injection → сложнее тестировать
@Setter injection → зависимости необязательны
Constructor injection делает код надёжнее, чище и проще в сопровождении. Это де-факто стандарт для Spring-приложений.