Назад к вопросам
Middle
71
questionbank

Почему в современном 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 приложениях, так как он способствует созданию неизменяемых объектов и упрощает тестирование.