2011-11-15 43 views
3

我需要針對不同的運行時環境(思考測試,登臺和生產服務器)配置不同的@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活躍。

+0

這是非常令人沮喪的,我們需要編寫一個擴展名來切換替代品...... –

回答

1

你可能想看看JBoss Seam,特別是Solder子項目。

它允許依賴驅動的CDI解析,以便某些bean只有在其他bean或資源可用時纔可用。 (如果「dataSource」可用,則爲A類,如果「entityManager」可用則爲B類)

由於它是開源的,您還可以看看它們是如何連接在一起的,並將這些知識作爲寫作的基礎如果需要的話你自己的擴展如果你使用的是JSF,那麼我強烈推薦使用SEAM-JSF,因爲它擺脫了擁有兩個注入框架(JSF DI/CDI)的麻煩,並允許在JSF範圍內使用CDI bean。

+0

謝謝,您的提示讓我走向了正確的方向! – nsn

+0

很高興聽到它。希望它比beans.xml更好。 – SplinterReality