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