我需要針對不同的運行時環境(思考測試,登臺和生產服務器)配置不同的@Alternatives,@Decorators和@Injectors。運行時的JSR-299(CDI)配置
現在我使用maven創建三個戰爭,這兩個戰爭之間的唯一區別在於beans.xml文件。有一個更好的方法嗎?我確實有針對不同環境的@Alternative @Stereotypes,但即便如此,我仍然需要修改beans.xml,並且它們不適用於@Decorators(或者它們是幹什麼的?)
是否可以通過某種方式指示CDI忽略beans.xml中的值並使用自定義配置源?因爲那樣我可以例如讀取系統屬性或其他環境變量。
該應用程序專門運行在使用焊接的容器中,因此焊接特定的解決方案可以。
我已經試圖谷歌這個,但似乎無法找到很好的搜索條件,我問Weld-Users-Forums,但無濟於事。有人在那裏建議編寫我自己的自定義擴展,但我找不到任何API在運行時實際更改容器配置。
我認爲有可能擁有某種@ApplicationScoped配置bean並將其注入到所有@Decorators中,然後可以決定它們是否應該是活動的,然後爲了配置@Alternatives寫@Produces方法對於有多個實現的每個接口,並在那裏注入配置bean。 但是,在我看來,像很多不必要的工作基本上重複已經存在於CDI中的功能?
編輯
好吧,我意識到我有點傻了,當然也可以使用CDI擴展API在運行時添加定型和inteceptors:
void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
bbd.addInterceptorBinding(...)
bbd.addStereotype(...)
}
但我沒有找到一個API來添加一個裝飾器。我發現的唯一的事情是激活所有@Decorators在beans.xml中,然後觀察
public <T> void processAnotated(@Observes ProcessAnnotatedType<T> event)
,並呼籲
event.veto()
,如果我不想@Decorator活躍。
這是非常令人沮喪的,我們需要編寫一個擴展名來切換替代品...... –