Мое понимание в альтернативной является то, что это является альтернативой какой-либо другой реализации интерфейса, который можно использовать в различных условиях развертывания (например, тестирование среды). An альтернатива bean объявляется путем аннотации его @Alternative
.
Чтобы использовать альтернативу в данном сценарии развертывания, вы выбираете его в элементе <alternatives>
дескриптора развертывания CDI META-INF/beans.xml
. Это позволит использовать @Alternative
бобы, которые по умолчанию отключены.
Когда включено, если контейнер обнаруживает двусмысленную зависимость для данной точки впрыска, он будет рассматривать альтернативы, которые могут быть введены, и, если есть ровно один, выберите эту альтернативу.
Другими словами, альтернативы это отличный способ, чтобы заменить существующую реализацию с другой во время развертывания. Если заменить нечего, вам не нужны альтернативы, просто положите свою банку на путь класса. Не уверен, что это был именно ваш вопрос, хотя, я сомневаюсь в концепции сторонних банок.
Подробнее в 2.1.4. Alternatives, 4.6. Alternatives и 4.7. Fixing unsatisfied and ambiguous dependencies (но я думаю, что это то, что вы читаете).
Обновление: Чтобы ответить на ваш дополнительный вопрос.
Если нет, то, как использовать бобы из библиотек 3 участника, которые не имеют beans.xml
Это не может произойти, архив бин должен иметь bean.xml
(быть пустым), как подробно в разделе 15.6. Packaging and deployment документации:
CDI не определяет какой-либо специальный архива развертывания. Вы можете упаковать бобы в JAR, EJB-JAR или WARs-any местоположение развертывания в приложении classpath. Однако архив должен быть быть «bean archive».Это означает, что каждый архив, содержащий бобы должен содержать файл с именем beans.xml
в META-INF
каталоге или классам WEB-INF
каталог веб-сервера (для WAR архива). Файл может быть пустым. Бобы, развернутые в архивах, которые не , имеют файл beans.xml
не будут доступны для использования в приложении.
Затем, чтобы устранить неудовлетворенную и неоднозначную зависимость, см. Раздел 4.7, упомянутый ранее.
Обновление 2: Похоже, что с помощью BeforeBeanDiscovery.addAnnotatedType()
можно добавлять другие классы, которые необходимо учитывать при обнаружении бобов. (BeforeBeanDiscovery
является событием)
Нет ли способа достичь этого, кроме определения метода производителя?Я иногда даже не понимаю, что происходит с некоторыми руководителями дизайнеров, когда такой простой случай использования (т. Е. Причиной того, что компонент из сторонней банки является управляемым компонентом и может быть введено) требует всей этой дополнительной работы , Похоже, что beans.xml будет идеальным местом для этой конфигурации, но он имеет только элемент исключений, а не «включает» ... действительно ??? – GreenieMeanie
Это 2 строки строго типизированного кода. Таким образом, вы видите это в своей среде IDE, если ищете поиск типа, у вас есть идеальная поддержка CDI в большинстве IDE в эти дни и т. Д. Так что я _really_ предпочитаю это для 2 строк нетипизированного XML. Вы никогда не сталкивались с такими 600-строчными XML-монстрами, которые никто больше не может готовить (и 80% из них на самом деле не нужны)? – struberg
Это 2 строки кода ДЛЯ КАЖДОГО КЛАССА, которым вы хотите управлять, что в случае сторонней банки может иметь много, скажем, 100+, например. XML может быть очень простым: ie . Это одна строка факультативного XML (существующее обнаружение все равно будет работать одинаково), возможно, будет включать в себя больше классов из JAR-файла, который не был построен с beans.xml, а не 600, как вы подразумеваете. Извините, я до сих пор не вижу вашей точки. –
GreenieMeanie