Мне нужно настроить разные @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 был активным.