Согласно Javadoc для Autowired , аннотацию можно использовать для «метода конструктора, поля, метода установки или метода конфигурации». См. полную документацию для получения более подробной информации.
Я лично предпочитаю ваш первый вариант (внедрение в конструктор), потому что поле myDao
может быть помечено как окончательное:
@Controller
public class MyControllear {
private final MyDao myDao;
@Autowired
public MyController(MyDao myDao) {
this.myDao = myDao;
}
Внедрение в конструктор также позволяет тестировать класс в модульном тесте без кода, который зависит от Spring.
Второй вариант лучше записать как:
@Controller
public class MyControllear {
@Autowired
private MyDao myDao;
MyController() {
}
При внедрении полей Spring создаст объект, а затем обновит поля, помеченные для внедрения.
Одна из опций, которую вы не упомянули, заключалась в использовании @Autowired
для метода установки (инъекция метода установки):
@Controller
public class MyControllear {
private MyDao myDao;
MyController() {
}
@Autowired
public void setMyDao(MyDao myDao) {
this.myDao = myDao;
}
Вам не нужно выбирать одно или другое. Вы можете использовать инъекцию поля для некоторых зависимостей и конструктор для других для того же объекта.