Spring @Autowired использование
каковы плюсы и минусы использования @Autowired в классе, который будет подключен к весне?
просто чтобы уточнить, я говорю конкретно о @Autowired аннотация, а не автоматическая проводка в XML.
Я, вероятно, просто не понимаю этого, но мне это почти кажется анти-шаблоном - ваши классы начинают осознавать, что они привязаны к структуре DI, а не просто являются POJOs. Может быть, я жажду наказания, но мне нравится иметь внешнюю XML-конфигурацию для бобов, и мне нравится иметь явные проводки, поэтому я точно знаю, что связано где.
9 ответов:
долгое время я считал, что есть ценность в том, чтобы иметь "централизованную, декларативную конфигурацию", такую как xml-файлы, которые мы все использовали. Тогда я понял, что большинство вещей в файлах не было конфигурация - это никогда не было изменено нигде после развития, никогда. Тогда я понял, что "централизованный" имеет значение только в довольно небольших системах - только в небольших системах вы когда-нибудь сможете Грок файл конфигурации в целом. А что такое на самом деле значение понимания проводки в целом, когда одни и те же" проводки " в основном дублируются зависимостями в коде? Поэтому единственное, что я сохранил,-это метаданные (аннотации), которые все еще являются декларативными. Эти никогда изменить во время выполнения, и они никогда Данные "конфигурации", которые кто - то изменит на лету-поэтому я думаю, что держать его в коде приятно.
Я использую полную автоматическую проводку столько, сколько могу. Я люблю это. Я не вернусь к старому стилю весна, если не угрожать под дулом пистолета. Мои причины для предпочтения полностью
@Autowiredизменились с течением времени.сейчас я думаю, что самая важная причина для использования autowiring заключается в том, что в вашей системе меньше абстракции для отслеживания. "Имя Боба" фактически исчезло. Оказывается, имя компонента существует только из-за xml. Так что полный слой реферат косвенные обращения (где бы провод бин-имя "foo" в бар в зернах "") ушел. Теперь я подключаю интерфейс" Foo " к своему Бобу непосредственно, а реализация выбирается по профилю времени выполнения. Это позволяет мне работа с кодом при трассировке зависимостей и реализаций. Когда я вижу зависимость autowired в своем коде, я могу просто нажать клавишу" перейти к реализации " в моей IDE, и появится список известных реализаций. В большинстве случаев есть только одна реализация, и я прямо в классе. Не может быть намного проще, и я всегда знаю ровно какая реализация используется (Я утверждаю, что противоположное ближе к истине с XML-проводкой-забавно, как меняется ваша перспектива!)
теперь можно сказать, что это просто очень простой слой, но каждый слой абстракции, который мы добавляем в наши системы увеличить сложности. Я действительно не думаю, что xml когда-либо добавлял какую-либо реальную ценность в любую систему, с которой я работал.
большинство систем, с которыми я когда-либо работал, имеют только один конфигурация рабочей среды выполнения. Там могут быть другие конфигурации для теста и так далее.
Я бы сказал, что полная автопроводка-это ruby-on-rails spring: он охватывает понятие о том, что существует нормальный и общий шаблон использования, который следует за большинством случаев использования. С конфигурацией XML вы разрешение много последовательного / несогласованного использования конфигурации, которое может / не может быть предназначено. Я видел так много xml-конфигурации идут за борт с несоответствиями - он получает рефакторинг вместе с кодом ? Я так и думал. Являются эти вариации существуют не просто так? Обычно нет.
мы почти не используем отбор в нашей конфигурации, и нашли другие способы решения этих ситуаций. Это явный "недостаток", с которым мы сталкиваемся: мы немного изменили способ, которым мы кодируем, чтобы сделать его более плавным с autowiring: репозиторий клиента больше не реализует generic
Repository<Customer>интерфейс, но мы делаем интерфейсCustomerRepositoryчто расширяетRepository<Customer>. Иногда есть трюк или два, когда дело доходит до наследования. Но это обычно просто указывает нам в направлении более сильного набора текста, который я нахожу почти всегда лучшим решением.Но да, вы привязываетесь к определенному стилю DI, который в основном делает весна. Мы даже не делаем публичные сеттеры для зависимостей больше (так что вы можете утверждать, что мы +1 в отделе инкапсуляции / сокрытия информации) у нас все еще есть некоторый xml в нашей системе, но xml в основном только содержит аномалий. Полный автоэлектропроводка прекрасно интегрируется с XML.
единственное, что нам сейчас нужно, это для
@Component,@Autowiredа остальные должны быть включены в JSR (например JSR-250), так что нам не нужно связываться с весной. Именно так все происходило в прошлом (thejava.util.concurrentпрочее приходит на ум), поэтому я не был бы удивлен, если бы это случилось снова.
для меня вот что мне нравится / не нравится в Spring и auto-wiring.
плюсы:
- автоматическая проводка избавляется от неприятной конфигурации XML.
- гораздо проще использовать аннотации, которые позволяют вводить непосредственно с помощью полей, методов сеттера или конструкторов. Также позволяет комментировать и "квалифицировать" ваши вводимые бобы.
плюсы:
- использование автоматической проводки и аннотаций делает вас зависимым от библиотек Spring где, как и в конфигурации XML, вы можете выбрать для запуска С или без Spring. Как вы сказали, вы привязываетесь к структуре DI.
- в то же время мне нравится иметь возможность "квалифицировать" бобы, для меня это делает код действительно грязным. Если вам нужно ввести один и тот же Боб в нескольких местах, я видел, что одно и то же имя строки повторяется повсюду. Мне кажется, что это может привести к ошибкам.
Я начал использовать автоматическую проводку почти исключительно на работе, потому что мы зависим так много на весенней интеграции в любом случае, что вопрос зависимости является спорным. Я работал над проектом Spring MVC, который широко использовал автоматическую проводку, и мне было немного сложно обернуть голову.
Я думаю, что автоматическая проводка-это приобретенный вкус, как только вы привыкнете к ней, вы поймете, насколько мощно, легко и гораздо меньше головной боли работать с ней, чем с конфигурацией XML.
мы переходим от @Autowire обратно к конфигурации XML в нашем большом проекте. Проблема заключается в очень низкой производительности начальной загрузки. Autowiring scanner загружает все классы из autowiring search classpath, поэтому многие классы загружаются с нетерпением во время весенней инициализации.
было очень мало дискуссий о переходе сред. Большинство проектов, над которыми я работал, были реальной проблемой для внедрения зависимостей в зависимости от среды, над которой мы работаем. С XML config это довольно просто с Spring EL, и я не знаю ни одного хорошего решения с аннотациями. Я только что понял один:
@Value("#{${env} == "production" ? realService : dummyService}") private SomeService service;Он должен работать, но не хорошее решение имхо.
я переключился на @Autowire. Поддержание конфигурации XML на чем-либо, кроме небольшого проекта, стало задачей в своем собственном праве, и понимание быстро ухудшилось.
IntelliJ обеспечивает хорошую (не идеальную) поддержку весенних аннотаций.
мой взгляд на эту тему заключается в том, что конфигурация xml снижает четкость кода, особенно в больших системах.
аннотации, такие как @Component, делают все еще хуже. Это заставляет разработчиков делать объекты изменяемыми, поскольку зависимости больше не могут быть окончательными, учитывая, что необходимо предоставить конструкторы по умолчанию. Зависимости должны быть либо вводят через публичный сеттер, или неконтролируемая с помощью @подгружен. [еще хуже инъекция зависимостей скомпрометирована классами это создает их зависимости, я все еще вижу это в недавно написанном коде!]. Под неконтролируемым я имею в виду, что в больших системах, когда доступно несколько реализаций (или дочерних) типа, он становится гораздо более вовлеченным, чтобы понять, какая из реализаций была @Autowired, сложность, которая делает исследование ошибок намного сложнее. Это также означает, что, предположительно, у вас есть профиль для тестовой среды и другой для производства, ваши производственные ошибки будут происходить только тогда, когда это больно больше всего производство, а не возможность обнаружить ошибки в тестовой среде, или даже лучше, во время компиляции!
Я придерживаюсь середины, где я объявляю свой класс конфигурации (ы), (Java на основе Spring configuration с помощью @Configuration)
Я объявляю все мои бобы явно в классе (классах) конфигурации. Я использую только @Autowired в классе(классах) конфигурации, цель состоит в том, чтобы ограничить зависимость от Spring до класса (классов) конфигурации
в @Configuration находятся в определенном пакете, это единственное место, где выполняется сканирование spring. (Что существенно ускоряет время запуска в крупных проектах)
Я стремлюсь сделать все мои классы неизменными, особенно объект данных, JPA, Hibernate и Spring, а также многие библиотеки сериализации, похоже, подрывают это. Я избегаю всего, что заставляет меня предоставлять сеттеры или удалять последнее ключевое слово из моей декларации свойств.
снижение возможности изменения объектов после их создания, значительно уменьшает ошибки в большой системе, а также сокращает время, чтобы найти ошибку, когда она существует.
также кажется, что это заставляет разработчика лучше проектировать взаимодействие между различными частями системы. Проблемы и ошибки становятся все больше и больше ошибок компиляции, что сокращает потерянное время и повышает производительность.
вот некоторые из опыта
плюсы
- упрощает настройку, потому что мы можем просто использовать аннотацию @Autowire
- Не хочу использовать методы сеттера, поэтому класс будет более чистым
минусы
- плотно пара в xml-файл, хотя мы используем DI
- трудно найти реализацию (но если вы используете хорошие IDE, такие как intellij, вы можете избавиться это)
из моего личного опыта я не использовал аннотацию @AutoWire так много, но в тестовых случаях.
Я очень люблю писать с аннотациями, а не XML. Согласно руководству Spring и последним версиям, XML и аннотации достигли того же результата.
Это мой список
Pro:
- удалить бесполезную строку из xml
- упростите отладку кода: когда вы открываете класс, вы можете прочитать, что у вас есть в классе
- более быстрая разработка, проект С 400 или более строк XML является читается?
плюсы:
- не является стандартной реализацией Java, но вы можете переключиться на использование @Inject, который является стандартным Api Java, поэтому Боб остается Pojo
- вы не можете просто использовать везде, db connection e так далее, но это только мнение, я предпочитаю иметь место, где читают всю конфигурацию.
для моего понимания @Autowired лучше всего использовать, когда ссылаются на ссылку на интерфейс и используют его функции переопределения, но я только нахожу проблему с этим в том, что он иногда присваивается null во время выполнения.
Comments