Плюсы и минусы сеттера/конструктора автопроводки Spring

При использовании @Autowired (не конфигурации xml) может ли кто-нибудь сравнить преимущества и недостатки привязки набора/конструктора?

См. следующие примеры:

public class Example{
   private Logger log;
   // constructor wiring
   @Autowired 
   public Example(Logger log){
      this.log = log;
   }
}

public class Example{
   // setter wiring
   @Autowired 
   private Logger log;
}

person Community    schedule 16.04.2011    source источник


Ответы (4)


Это полностью вопрос предпочтений.

Spring не одобряет внедрение конструктора или, по крайней мере, привык к этому, потому что таким образом появляются циклические зависимости, и ими трудно управлять (A нуждается в B в конструкторе, B нуждается в A в конструкторе).

Одно фактическое отличие состоит в том, что с @Autowired в поле вам не нужен метод установки, который, с одной стороны, делает класс меньше и легче для чтения, но, с другой стороны, делает насмешку над классом немного уродливее.

Я предпочитаю инъекцию поля.

person Bozho    schedule 16.04.2011
comment
что вы имеете в виду о внешних бобах? - person Adi Sembiring; 16.04.2011
comment
сторонние классы. я уточню - person Bozho; 16.04.2011
comment
Божо, пожалуйста, взгляните на примеры, которые я привел в вопросе, и прокомментируйте, если у вас есть что добавить. Спасибо! - person ; 16.04.2011

Играя в адвоката дьявола еще долго после того, как все проголосовали за внедрение полей, вот несколько преимуществ использования конструкторов, собранных в результате опроса коллег:

  • позволяет использовать final и обеспечивать неизменность
  • немного меньше шансов забыть аннотировать введенное свойство в конструкторе, чем в виде поля
  • затрудняет случайное создание объекта, который должен быть создан с помощью инжектора

Мне по-прежнему нравится тот факт, что если мне нужно аннотированное поле в другом классе, я могу просто скопировать-вставить и покончить с ним, а не добавлять его в конструктор, но это лишь второстепенное соображение.

person Lolo    schedule 20.02.2013

Конкретная причина для аннотирования сеттеров: сеттеры могут затем сохранять ссылки на bean-компоненты в статические переменные.

person wm schauweker    schedule 23.08.2012

Если вы не использовали автомонтирование, существует большая разница между внедрением конструктора и сеттера. Вы пишете XML по-другому, чтобы внедрить зависимости. И зависимости внедрения сеттера являются необязательными, а зависимости внедрения конструктора - нет.

Единственная причина, по которой я могу придумать автоматическое связывание, — избежать проблемы циклической зависимости. Если A имеет B имеет автосвязывание с конструктором, а B имеет то же самое для A, мы не можем создать экземпляр ни одного из них. В этом может помочь предоставление зависимости от сеттера.

person Akash5288    schedule 26.11.2015