Инъекция зависимости весны - PullRequest
2 голосов
/ 13 апреля 2011

Я учу Spring, используя Spring Recipes.На данный момент я понял, что мы можем вводить зависимости, используя Setter Injection или Injecting через конструктор.Мой вопрос: в реальных приложениях какой метод используется чаще и почему?Я знаю, что это субъективный вопрос, но я не могу придумать лучшего места, чем этот сайт, чтобы получить идеальное представление.Еще раз спасибо.

Ответы [ 5 ]

4 голосов
/ 13 апреля 2011

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

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

Если сомневаетесь, попробуйте использовать инжектор конструктора и возвращайтесь к сеттерам только при необходимости.

2 голосов
/ 13 апреля 2011

Другие ответы уже очень ясны в связи с тем фактом, что добавление в конструктор более безопасно с точки зрения того, что вы забыли установить поле. - Вы можете просто не создавать экземпляр без поля. Таким образом, один совет из этих утверждений может быть следующим: использовать конструктор для обязательных полей и метод установки или поля для необязательных полей.

И 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, у них вообще нет инжектора конструктора.

2 голосов
/ 13 апреля 2011

Внедрение в конструктор считается лучше, чем вложение в сеттер, по многим причинам, так как внедрение в конструктор гарантирует выполнение всех обязательных свойств, и просто невозможно создать экземпляр объекта в недопустимом состоянии.Пожалуйста, смотрите этот пост для примера: http://www.redcode.nl/blog/2010/09/setter-vs-constructor-injection/

0 голосов
/ 21 мая 2012

Есть плюсы и минусы в каждом направлении. Я бы сказал, что внедрение зависимостей на основе конструктора менее подвержено ошибкам, поскольку вы навязываете определенные правила и сообщаете своему классу, какие зависимости нужны его методам. Более того, внедрение в конструктор обеспечивает порядок инициализации и предотвращает циклические зависимости. С впрыском сеттера неясно, в каком порядке нужно создавать экземпляры и когда выполняется подключение.

С другой стороны, есть причины, по которым выигрывает впрыск сеттера. Модульное тестирование всегда проще, если конструкторы просты и делают меньше или вообще ничего не делают. Кроме того, не все методы класса требуют одинаковых зависимостей. Если вы используете контейнер Spring для внедрения своих зависимостей, вам не всегда нужно беспокоиться об этом, потому что контейнер Spring автоматически вызовет ваши установщики, если вы настроите его правильно.

0 голосов
/ 13 апреля 2011

Я предпочитаю инжектор конструктора сам.Я использую Spring с 2005 года.

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