Sobes.tech
Middle
86
questionbank

Почему в Spring больше не требуется указывать аннотацию @Autowired?

Ответ от нейросети

sobes.tech AI

Начиная с Spring 4.3, если класс имеет только один конструктор, Spring автоматически рассматривает его для внедрения зависимостей без явного указания @Autowired.

Пример:

// Пример до Spring 4.3
@Component
public class MyService {
    private final AnotherService anotherService;

    @Autowired // Явное указание @Autowired
    public MyService(AnotherService anotherService) {
        this.anotherService = anotherService;
    }
}

// Пример с Spring 4.3 и выше
@Component
public class MyService {
    private final AnotherService anotherService;

    // @Autowired не требуется
    public MyService(AnotherService anotherService) {
        this.anotherService = anotherService;
    }
}

Это изменение упрощает код и согласуется с принципом явных зависимостей через конструктор. Для классов с несколькими конструкторами или для внедрения через поля или сеттеры @Autowired по-прежнему требуется или нужно использовать квалификаторы/приоритеты.

Сравнение подходов:

Подход Плюсы Минусы
Внедрение через конструктор с @Autowired (до 4.3) Явное указание намерения Избыточность для класса с одним конструктором
Внедрение через конструктор (с 4.3) Более чистый код, следование принципу явных зависимостей Менее очевидно для новичков, привыкших к явному @Autowired
Внедрение через поля Краткий синтаксис Скрывает зависимости, усложняет тестирование
Внедрение через сеттеры Может использоваться для опциональных зависимостей Более многословный, зависимости могут быть null