что является преимуществом использования @configurable по сравнению с боб, который не управляемый боб делает ди по applicationcontext.getbean? кто-нибудь из списка про и против?преимущество использования applicationcontext.getbean против @configurable
ответ
Я собираюсь получить -20 для этого. Даже пресловутый Мартин Фаулер, который изобрел это ужасающее название «Dependency Injection» не думает, что это лучше для тестирования:
http://martinfowler.com/articles/injection.html
Частой причиной люди дают для предпочитающих инъекции зависимостей является то, что она делает тестирование легче , Дело в том, что для проведения тестирования вам нужно легко заменить настоящие сервисные реализации заглушками или макетами. Однако здесь нет никакой разницы между инъекцией зависимостей и локатором сервисов: оба они очень подходят для прерывания. Я подозреваю, что это наблюдение происходит от проектов, в которых люди не прилагают усилий для обеспечения того, чтобы их локатор обслуживания можно было легко заменить. Это то, где постоянное тестирование помогает, если вы не можете легко заглушить услуги для тестирования, то это подразумевает серьезную проблему с вашим дизайном.
Вот мои возражения:
DI превращает зависимость реализации в зависимости интерфейса. Ваш класс загрязнен сеттерами, которых в противном случае не было. Да, реальный процесс проверки зависит от службы кредитных карт, почтовой службы, службы базы данных и тех, кто знает, что завтра, но мы не должны рекламировать эти зависимости. Они ad-hoc, по требованию, не совместимы с интерфейсом. Возможно, в следующем месяце весь процесс проверки сводится к простому звонку REST.
Производительность. Обычно услуги не нужны за пределами одного метода. DI требует, по меньшей мере, переменной поля для каждой службы, и на нее ссылаются, пока объект хоста жив. Если у службы есть условия для каждого клиента, это очень плохо. Я не чувствительный к производительности парень, но это просто неправильно.
Кодирование для производственной среды сделана более твердой. Подумайте, сколько еще кода котельной плиты вы добавили для использования DI, каждый раз, когда вам нужна услуга. Все это во имя облегчения тестирования. Прежде всего - что ?! Производство является первым приоритетом; тестирование должно работать на него и с ним, а не наоборот. Тестирование - это не религия, люди! Фокус на производственной среде, беспокоиться о тестировании позже. Второе - тестирование действительно проще сейчас?
При тестировании вам нужно только издеваться над несколькими услугами, которые являются тяжелыми и включают в себя действия вне VM. С помощью локатора служб у вас есть тестовая конфигурация, содержащая эти макетные службы, и все готово.Процесс проверки может быть протестирован без каких-либо хлопот, а также со всеми классами, которые зависят от этих услуг. В DI вы должны вручную управлять этими зависимостями, в каждый единичный тест. -Но! Но с DI у вас есть гибкость предоставления различных макет почтовых услуг для разных тестовых блоков сейчас! О, хорошо для вас!
«DI поощряет единую конфигурацию обслуживания» - , только если вы используете ту же структуру. На самом деле это не имеет никакого отношения к DI; структура обеспечивает один из способов настройки, вы также можете утверждать, что Spring поощряет единый способ поиска. Когда структура становится широко используемой, она может стать стандартом де-факто, поэтому разные разработчики легче разговаривают друг с другом - только потому, что сетевой эффект, а не что-то по своей сути хороший выбор.
В заключение, это плохо для дизайна, плохого для производительности, плохого для производства, плохого для тестирования и не имеет значения для установления стандартов. Для чего это? Это похоже на множество немых правил и условностей, давно установленных сомнительным происхождением, но мы по-прежнему следим за ними вслепую каждый день. Вот что заставляет общество ходить.
редактировать: прямая линия связь на новый вопрос, касающийся DI и тестирование Does using annotations to inject dependencies remove the main benefit of dependency injection(external configuration)?
Выполнение applicationContext.getBean()
полностью нарушает назначение зависимой инъекции, потому что вы больше не зависите от инъекций. XML-файл контекста приложения отлично. Конфигурация на основе аннотаций (автоматическая проводка) также прекрасна. Таким образом, вы можете также делать:
Service service = new Service();
или хуже:
Service service = ServiceLocator.locate("service");
Оба, которые делают ваш код трудно проверить.
@cletus, вы можете прокомментировать, используя applicationcontextaware в этой статье http://tinyurl.com/ycrdnsa по сравнению с традиционным способом применения. getbean? – cometta
Почему вы говорите «Сервис-сервис = ServiceLocator.locate (« service »)' хуже, чем «Service service = new ServiceImpl()» (я предполагаю, что это то, что вы имели в виду, иначе DI все равно бессмысленно)? Я часто использую локаторы сервисов во всем коде; Я бы, наверное, с ума сошел прямо с помощью инъекционных услуг на каждую страницу пользовательского интерфейса. Реализации локатора легко подключаются (контекстно-зависимые и смеются); Я честно не понимаю, как использование локаторов делает тестирование труднее. – ChssPly76
это затрудняет работу, если они не могут быть легко подключены. это звучит так, как будто они вставляются в * вашу * реализацию –
- 1. ApplicationContext.getBean против нового ключевого слова
- 2. В angular2, преимущество использования zone.run против changeDetecotor.markForCheck()
- 3. Преимущество прохождения по ссылке против использования глобальных?
- 4. Динамически autowire bean без использования ApplicationContext.getBean() весной
- 5. Преимущество использования рамочного CSS
- 6. Преимущество JavaScript: весело() против удовольствия()
- 7. React Native - В чем преимущество использования StyleSheet против простого объекта?
- 8. Самое большое преимущество использования ASP.Net MVC против веб-форм
- 9. Преимущество использования HAProxy И Keepalived против всего Keepalived
- 10. Что такое преимущество использования SQLite против java.sql на андроид
- 11. Неудобство/Преимущество использования Tabris против PhoneGap или титана или Corona
- 12. Преимущество использования Object.hasOwnProperty против тестирования, если свойство не определено
- 13. В чем преимущество использования конструктора перемещения против передачи указателя?
- 14. Есть ли преимущество использования отправителя пользовательских событий против отправителя выполнения
- 15. Любое преимущество использования переменной с тильдой в javascript против -1?
- 16. преимущество использования перечисления
- 17. Преимущество использования EJB's
- 18. Преимущество использования Object.create
- 19. Преимущество использования «этого».
- 20. Преимущество использования CopyStreamListener?
- 21. Преимущество использования потока CUDA
- 22. Преимущество использования glMapBuffer
- 23. Преимущество использования рамки CSS
- 24. Преимущество использования DialogResult.Cancel
- 25. Преимущество использования Executors.newSingleThreadExecutor()
- 26. Преимущество использования Immutablemap guava
- 27. dispatch_async преимущество использования
- 28. Преимущество использования JPA
- 29. Весна против EJB (преимущество и недостаток)
- 30. Как избежать использования ApplicationContext.getBean() при реализации Spring IOC
хорошие комментарии, чувак! – cometta
Сетки не являются обязательными (т.е. автоматическая проводка). Без них вы не можете помещать макет объекта, чтобы на самом деле проверить свой код, поэтому выбор - это тестируемость и набор шаблонов? Шутки в сторону? Ваши взгляды на влияние DI на производительность в лучшем случае наивны. Я не знаю, получишь ли ты -20 для этого ответа ... ну, я не могу говорить за другого -18. – cletus
Производительность: Обычно я не подсчитываю байты и миллисекунды, но объявление объекта за пределами используемой области делает меня неудобным. только если инфраструктура DI может внедрить сервис в локальную переменную метода! подождите, пока он уже существует, он называется локатором службы. – irreputable