創建便攜式CDI分機的示例(如this)全部使用javax.enterprise.inject.spi.Extension擴展點以允許ServiceLoader加載擴展。如何以編程方式添加便攜式CDI Extension?
是否有虛焊/ CDI API/SPI動態註冊的擴展,編程?
我知道,因爲你已經開始應用,而不該擴展存在,並且也許是在某些方面「爲時已晚」,但要問反正生命週期可能是一個問題。具體來說,我想知道EE環境。
創建便攜式CDI分機的示例(如this)全部使用javax.enterprise.inject.spi.Extension擴展點以允許ServiceLoader加載擴展。如何以編程方式添加便攜式CDI Extension?
是否有虛焊/ CDI API/SPI動態註冊的擴展,編程?
我知道,因爲你已經開始應用,而不該擴展存在,並且也許是在某些方面「爲時已晚」,但要問反正生命週期可能是一個問題。具體來說,我想知道EE環境。
給出一個簡短的回答 - CDI故意不提供API來動態添加擴展。事實上,你不應該試圖達到這一點。
的原因了一下:
CDI是靜態的,它的本質 - 它引導和推廣過程中需要一定的信息就是其中之一。一旦完成了引導程序,擴展程序通常變得毫無用處(當然,您仍然可以將它們用作bean,並且在那裏有一些邏輯,但它只是'',然後是)。原因是擴展鉤入自舉週期並可能影響每個階段(ProcessAnnotatedType
,ProcessBeanAttributes
,...)。現在
,如果以某種方式加載這樣的擴展以後(例如,用引導CDI容器),將有兩個選擇;要麼重新加載整個CDI容器來考慮這個擴展,要麼完全忽略它的內容,使得它完全無用,因爲它會像一個普通的bean一樣工作(容器生命週期觀察者永遠不會被調用)。前者在某些部署中會非常昂貴/令人不安,並可能導致不可預測的結果 - 想象這種動態擴展會隨着替代方案和專業化而改變。後一種情況幾乎沒有意義,因爲它會添加一個從不使用的bean。這就是爲什麼CDI一般不允許這樣做的原因。
我想知道你的用例是什麼?如果我們知道這一點,也許我們可能會幫助您以不同的方式進行分類。
據我所知,沒有官方的API來支持這一點。
我知道2名黑客,你可能會根據你的使用情況,試圖/選項。
添加動態創建的SPI服務文件
你可以看一下的cdi unit源的自定義類加載器。上次我查看時,它使用反射和實現特定的類來訪問Weld的內部以影響初始化。我會不是推薦該方法的其他事情比測試。
爲什麼要動態加載擴展?
一個簡單的解決方案可能是始終加載擴展,並把它決定真正做一些事情。
Thx。同意加載它的簡單解決方案,並在邏輯中添加切換,聽起來不錯! –
謝謝。在我的使用案例中,另一個答案是,獲得控制權,但隨後守護邏輯以進一步調用** BeforeBeanDiscovery **和其他一些屬性,這是非常合適的。很好奇,如果這確實是設計意圖,所以接受這個答案,因爲它解決了這個問題。 –
只有在特殊情況下才會爲'processAnnotatedType'增加一個觀察者而沒有'@ WithAnnotations'。只有在澤西島時,'Hk2CustomBoundTypesProvider'已被定義。 –