Конфигурация JSR-299 (CDI) во время выполнения - PullRequest
3 голосов
/ 15 ноября 2011

Мне нужно настроить разные @Al Альтернативы, @Decorators и @Injectors для разных сред времени выполнения (например, тестирование, промежуточные и производственные серверы).

Сейчас я использую maven для создания трех войн, и единственное различие между этими войнами заключается в файлах beans.xml. Есть лучший способ сделать это? У меня есть @Alternative @Stereotypes для разных сред, но даже тогда мне нужно изменить beans.xml, и они не работают для @Decorators (или нет?)

Можно ли как-то дать CDI указание игнорировать значения в beans.xml и использовать пользовательский источник конфигурации? Потому что тогда я мог бы, например, прочитать системное свойство или другую переменную окружения.

Приложение работает исключительно в контейнерах, в которых используется сварка, поэтому решение для конкретного сварного шва будет приемлемым.

Я уже пытался найти это в Google, но, похоже, не могу найти хороших поисковых терминов, и я спросил Weld-Users-Forums , но безрезультатно. Кто-то там предложил написать мое собственное расширение, но я не могу найти API, который бы реально изменил конфигурацию контейнера во время выполнения.

Я думаю, что было бы возможно иметь какой-то компонент конфигурации @ApplicationScoped и внедрить его во все @Decorators, которые могли бы затем сами решить, должны ли они быть активными или нет, а затем для настройки @Al альтернативы написать методы @Produces для каждый интерфейс с несколькими реализациями и вводить конфиг bean там тоже. Но мне кажется, что это слишком много лишней работы, чтобы дублировать функциональность, уже присутствующую в CDI?

редактировать

Хорошо, я понял, что я немного глупый ... конечно, можно добавлять стереотипы и перехватчики во время выполнения, используя API расширения CDI:

void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
    bbd.addInterceptorBinding(...)
    bbd.addStereotype(...)
}

Но я не нашел API для добавления декоратора. Единственное, что я обнаружил, - это активировал все @Decorators в файле beans.xml, а затем наблюдал

public <T> void processAnotated(@Observes ProcessAnnotatedType<T> event)

и звоните

event.veto()

если я не хочу, чтобы @Decorator был активным.

1 Ответ

1 голос
/ 17 ноября 2011

Возможно, вы захотите взглянуть на JBoss Seam, в частности, на подпроект Solder.

Он допускает разрешение CDI, управляемое зависимостями, поэтому некоторые компоненты доступны только при наличии других компонентов или ресурсов.(Класс A, если доступен «dataSource», Класс B, если доступен «entityManager»)

Поскольку это открытый исходный код, вы также можете посмотреть, как они связали это вместе, и использовать эти знания в качестве основы.для написания собственного расширения, если это необходимо.

Если вы используете JSF, я настоятельно рекомендую также использовать SEAM-JSF, так как он избавляет от неудобств, связанных с наличием двух структур внедрения (JSF DI / CDI)и разрешает компоненты CDI в областях JSF.

...