Где предполагается @Autowired аннотация - на свойство или метод?

Что более верно?

Это (с @Autowired аннотацией к методу)?

@Controller
public class MyController
{
    private MyDao myDao;

    @Autowired
    public MyController(MyDao myDao)
    {
        this.myDao = myDao;
    }

Это (с @Autowired аннотацией к свойству)?

@Controller
public class MyController
{
    @Autowired
    private MyDao myDao;

    public MyController(MyDao myDao)
    {
        this.myDao = myDao;
    }

Где должна появиться @Autowired аннотация?

Ответ 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;
    }

Вам не нужно выбирать тот или иной. Вы можете использовать полевую инъекцию для некоторых зависимостей и впрыска конструктора для других для одного и того же объекта.

Ответ 2

Аннотации идут со свойством, потому что это то, что было автоматически; свойство, которое будет автоматически установлено. Этот учебник имеет хороший пример. Этот более продвинутый пример показывает, как использовать квалификаторы для устранения неоднозначности проводки.