Spring autowiring setter / конструкторы плюсы и минусы

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


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

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

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

I предпочитаю полевую инъекцию.


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

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

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


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


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

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