Другие ответы уже очень ясны в связи с тем фактом, что добавление в конструктор более безопасно с точки зрения того, что вы забыли установить поле. - Вы можете просто не создавать экземпляр без поля. Таким образом, один совет из этих утверждений может быть следующим: использовать конструктор для обязательных полей и метод установки или поля для необязательных полей.
И Constructor Injection имеет два других воздействия:
- поля могут быть
final
- ( Мне нравятся конечные поля, потому что облегчить понимание )
- Нельзя строить кружки классов. (A.b и B.a) - Spring не может создать экземпляр этой конструкции. (* С архитектурной точки зрения, я думаю, что это про инжектор конструктора, а не мошенничество)
Но с другой стороны, если вы используете инжектор конструктора, вам нужно написать больше кода, чем необходимо.
public class FieldInjection {
@Ressource //the same like @Autowired(required=true)
private MyService myService;
}
намного короче:
public class MethodInjection {
private final MyService myService;
public MethodInjection(final MyService myService) {
assert(myService != null);
this.myService = myService;
}
}
Авторы других ответов будут ненавидеть меня за это утверждение.
Я лично считаю, что если у вас есть класс, который используется только как Spring Bean (но не без Spring), то вы можете использовать Injection на поле без этого сомнения в безопасности! - Потому что Spring поместит Бин в свой жизненный цикл, только если он может установить все поля, помеченные @Ressource
или @Autowired(required=true)
. Из-за этого я предпочитаю инжекцию поля, потому что это делает мою работу быстрее (меньше писать и меньше читать ). И для всех вещей инициализации я использую @PostConstruct
. (Конечно, вы не можете использовать поля в конструкторе. И вы не можете смешивать их оба.) - Это намного сильнее связывает мое приложение с контейнером IOC, чем с введением конструктора, но это не проблема для моего варианта использования. - Можете ли вы взглянуть на стандарт EJB 3.1, у них вообще нет инжектора конструктора.