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 |