Куда должна идти аннотация @Autowired - свойство или метод? - PullRequest
31 голосов
/ 19 сентября 2010

Что правильнее?

Это (с аннотацией @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?

Ответы [ 2 ]

51 голосов
/ 19 сентября 2010

Согласно 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;
    }

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

0 голосов
/ 19 сентября 2010

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

...