Подтвердить что ты не робот

Spring автоустановщик/конструктор PROs и CONs

При использовании @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;
}
4b9b3361

Ответ 1

Это все зависит от предпочтений.

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

С помощью autowiring единственная причина, по которой я могу думать, - избежать проблемы с круговой зависимостью. Если A имеет B, то он имеет автоуровневую зависимость от конструктора, а B имеет то же самое для A, мы не можем создать экземпляр любого из них. Предоставление одной зависимости сеттера может помочь в этом.