Установщик пружинных электромонтажников / конструктор PRO и CON - PullRequest
13 голосов
/ 16 апреля 2011

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

Ответы [ 4 ]

12 голосов
/ 16 апреля 2011

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

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

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

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

6 голосов
/ 21 февраля 2013

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

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

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

2 голосов
/ 24 августа 2012

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

0 голосов
/ 26 ноября 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...