Ответ
Начиная с Spring Framework 4.3, аннотацию @Autowired можно опустить для единственного конструктора класса. Фреймворк автоматически выполнит внедрение зависимостей через этот конструктор. Это часть конвенции over configuration, упрощающей код.
Правило:
- Если у бина один конструктор,
@Autowiredне нужен. - Если конструкторов несколько, необходимо аннотировать тот, через который Spring должен внедрять зависимости.
- Для внедрения в поля или сеттер-методы аннотация
@Autowiredпо-прежнему обязательна.
Пример (автовнедрение без @Autowired):
@Service
public class UserService {
private final UserRepository repository;
// Spring автоматически внедрит UserRepository
public UserService(UserRepository repository) {
this.repository = repository;
}
}
Пример (требуется @Autowired):
@Component
public class ExampleService {
private final DependencyA depA;
private DependencyB depB;
// Нужен @Autowired, так как конструкторов два
@Autowired
public ExampleService(DependencyA depA) {
this.depA = depA;
}
// Внедрение в поле - аннотация обязательна
@Autowired
public void setDepB(DependencyB depB) {
this.depB = depB;
}
}