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