Почему в современном Spring нет необходимости указывать аннотацию @Autowired?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Начиная с Spring 4.3, если у класса только один конструктор, Spring автоматически внедряет зависимости через этот конструктор, даже без @Autowired.
При наличии нескольких конструкторов Spring по-прежнему требует аннотацию @Autowired для явного указания, какой конструктор использовать для внедрения зависимостей.
Пример с единственным конструктором:
// Пример класса с одним конструктором
public class MyService {
private final SomeDependency dependency;
public MyService(SomeDependency dependency) { // Spring автоматически внедрит SomeDependency
this.dependency = dependency;
}
// ... другие методы
}
Пример с несколькими конструкторами и @Autowired:
// Пример класса с несколькими конструкторами
public class MyOtherService {
private final AnotherDependency anotherDependency;
private final OptionalDependency optionalDependency;
// Конструктор без зависимостей
public MyOtherService() {
this.anotherDependency = null;
this.optionalDependency = null;
}
@Autowired // Spring будет использовать этот конструктор для внедрения
public MyOtherService(AnotherDependency anotherDependency, OptionalDependency optionalDependency) {
this.anotherDependency = anotherDependency;
this.optionalDependency = optionalDependency;
}
@Autowired(required = false) // Дополнительный конструктор, использующий OptionalDependency
public MyOtherService(OptionalDependency optionalDependency) {
this.anotherDependency = null;
this.optionalDependency = optionalDependency;
}
// ... другие методы
}
Эта особенность снижает количество boilerplate-кода и делает классы более читаемыми, особенно при Constructor Injection. Это рекомендуемый способ внедрения зависимостей в современных Spring приложениях, так как он способствует созданию неизменяемых объектов и упрощает тестирование.