2010-02-15 9 views
6

Я знаю, что это все еще не очень популярно, так как спецификация была выпущена всего несколько месяцев назад.Разрешение внешних (сторонних) бобы в сварном шве

Я не «установлен» сварной шов еще, я просто читал, и по этому вопросу я хочу, чтобы убедиться, что я понял, это важный момент, правильно:

Каково разрешение бобов, которые находятся в 3-й -партики, достигнутые путем объявления их как <alternatives> в вашем beans.xml?

Если нет, то как использовать бобы из сторонних библиотек, которые не имеют beans.xml?

Ввод фляги на пути к классу не будет работать, если в их нет beans.xml, что вы не можете исправить для сторонних банок. (См Gavin King's post on the subject)

ответ

6

Почему так сложно?

Просто создайте метод изготовления для этих сторонних классов.

Предположим, у вас есть 3--й библиотека партии, которая автоматически принимает PDF-файлы и отправляет их в факс, и вы хотите использовать что-то вроде

private @Inject PdfFaxService faxService; 

в вашем коде, то вы могли бы просто обеспечить это с продюсером метод. PdfFaxService работает без гражданства, поэтому мы можем смело предположить, что мы можем сделать его @ApplicationScoped:

public @Produces @ApplicationScoped PdfFaxService createFaxService() { 
    return new PdfFaxService(initparameters); 
} 

где-то.

hth.

+0

Нет ли способа достичь этого, кроме определения метода производителя?Я иногда даже не понимаю, что происходит с некоторыми руководителями дизайнеров, когда такой простой случай использования (т. Е. Причиной того, что компонент из сторонней банки является управляемым компонентом и может быть введено) требует всей этой дополнительной работы , Похоже, что beans.xml будет идеальным местом для этой конфигурации, но он имеет только элемент исключений, а не «включает» ... действительно ??? – GreenieMeanie

+0

Это 2 строки строго типизированного кода. Таким образом, вы видите это в своей среде IDE, если ищете поиск типа, у вас есть идеальная поддержка CDI в большинстве IDE в эти дни и т. Д. Так что я _really_ предпочитаю это для 2 строк нетипизированного XML. Вы никогда не сталкивались с такими 600-строчными XML-монстрами, которые никто больше не может готовить (и 80% из них на самом деле не нужны)? – struberg

+0

Это 2 строки кода ДЛЯ КАЖДОГО КЛАССА, которым вы хотите управлять, что в случае сторонней банки может иметь много, скажем, 100+, например. XML может быть очень простым: ie . Это одна строка факультативного XML (существующее обнаружение все равно будет работать одинаково), возможно, будет включать в себя больше классов из JAR-файла, который не был построен с beans.xml, а не 600, как вы подразумеваете. Извините, я до сих пор не вижу вашей точки. – GreenieMeanie

3

Мое понимание в альтернативной является то, что это является альтернативой какой-либо другой реализации интерфейса, который можно использовать в различных условиях развертывания (например, тестирование среды). 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 является событием)

+0

ага, так что это не тот. К сожалению, добавление jar в classpath не будет работать, если у вас нет 'beans.xml' в нем - см. Блог-блог Gavin King - http://relation.to/Bloggers/WhyIsBeansxmlRequiredInCDI И я пытаюсь понять, как 3-й которые не используются в бин-архивах. – Bozho

+0

Итак, если вы хотите использовать пул соединений c3p0, то они (или вы) должны положить 'beans.xml' в банку, иначе вы не сможете использовать его с DI? – Bozho

+0

@Bozho Да, beans.xml является обязательным для «bean-архива», или бобы не будут доступны для приложения, как указано (обновлял мой ответ, когда вы отправляли свой комментарий). Я не упоминал об этом явным образом, когда писал свой «put it on the class path» в своем первоначальном ответе, но это подразумевалось :) –

 Смежные вопросы

  • Нет связанных вопросов^_^