Разрешение внешних (3 -я сторона) бобов в сварке
-
20-09-2019 - |
Вопрос
Я знаю, что это все еще не совсем популярно, так как спецификация была выпущена всего несколько месяцев назад.
Я еще не «установил» сварка, я просто читаю, и по этому вопросу я хочу убедиться, что я понял этот важный момент правильно:
Разрешение бобов, которые находятся в 3-й партийных банках, достигнутых, объявив их как <alternatives>
в твоей beans.xml
?
Если нет, то как использовать бобы из сторонних библиотек, у которых нет beans.xml
?
Поставить банку на дорожку класса, не будет работать, если нет beans.xml
в их META-INF
, что вы не можете справиться с сторонними банками. (видеть Пост Гэвина Кинга на эту тему)
Решение
Зачем так сложнее думать?
Просто сделайте производительность для этих сторонних занятий.
Давайте предположим
private @Inject PdfFaxService faxService;
В вашем коде вы можете просто предоставить это методом производителя. PDFFAXService работает без сохранения состояния, поэтому мы можем с уверенностью предположить, что мы можем сделать это @ApplicationScoped
:
public @Produces @ApplicationScoped PdfFaxService createFaxService() {
return new PdfFaxService(initparameters);
}
где-то.
hth.
Другие советы
Мое понимание альтернатива заключается в том, что это альтернатива какой -либо другой реализации интерфейса, которую вы можете использовать в другой среде развертывания (например, среда тестирования). Атмосфера альтернатива Бин объявляется, аннотируя его с @Alternative
.
Чтобы использовать альтернативу в данном сценарии развертывания, вы выбираете ее в <alternatives>
Элемент вашего дескриптора развертывания CDI META-INF/beans.xml
. Анкет Это позволит @Alternative
бобы, которые отключены по умолчанию.
При включении, если контейнер находит неоднозначную зависимость для данной точки впрыска, в нем будут рассматриваться альтернативы, которые могут быть введены, и, если есть ровно, возьмите эту альтернативу.
Другими словами, альтернативы хороший способ заменить существующая реализация с другим во время развертывания. Если нет ничего, чтобы заменить, вам не нужны альтернативы, просто поместите свою банку на путь класса. Не уверен, что это был именно ваш вопрос, я сомневаюсь в концепции 3-й стороны банок.
Больше 2.1.4. Альтернативы, 4.6 Альтернативы а также 4.7. Исправление неудовлетворенных и неоднозначных зависимостей (Но я думаю, что это то, что вы читаете).
Обновлять: Чтобы ответить на ваш дополнительный вопрос.
Если нет, то как использовать бобы из сторонних библиотек, в которых нет Beans.xml
Этого не может произойти, архив бобов должен иметь bean.xml
(будь пустое), как подробно описано в разделе 15.6. Упаковка и развертывание документации:
CDI не определяет какой -либо специальный архив развертывания. Вы можете упаковать бобы в банках, eJB-jars или войнах-любое место развертывания в приложении. Однако архив долженбыть "архивом бобов". Это означает, что каждый архив, содержащий бобы, должен включать в себя файл с именем
beans.xml
вMETA-INF
Справочник по пути илиWEB-INF
каталог веб -корня (для военных архивов). Файл может быть пустым. Бобы, развернутые в архивах, у которых нетbeans.xml
Файл не будет доступен для использования в приложении.
Затем, чтобы исправить неудовлетворенную и неоднозначную зависимость, см. Ранее упомянутый раздел 4.7.
Обновление 2: Похоже, что использование BeforeBeanDiscovery.addAnnotatedType()
Можно добавить другие классы, которые должны быть приняты во внимание во время обнаружения бобов. (BeforeBeanDiscovery
это событие)