假設我有一些類注射:如何告訴CDI容器「激活」一個bean?
class MyBean {
@Inject
Helper helper;
// all sorts of data
}
這個類是在一個方式CDI容器不知道它像反射,序列化或new
創建。在這種情況下,helper
是null
,因爲CDI沒有爲我們初始化它。
有沒有辦法告訴CDI「激活」這個bean或至少它的注入?例如,好像它是用Instance<MyBean>#get
創建的?
現在我有一個黑客,我做到以下幾點:
class SomeClass {
@Inject
Instance<MyBean> beanCreator;
void activateBean() {
MyBean mybean = ... // reflection/serialization/new
MyBean realBean = beanCreator.get();
Helper proxy = realBean.getHelper();
mybean.setHelper(proxy);
beanCreator.destroy(realBean);
}
}
這看起來很糟糕,但它爲我測試的一切。它只是顯示我想要的最終結果。
使用Wildfly 10.1如果它很重要。
謝謝。上下文:'MyBean'是我需要保存和加載的狀態對象的一部分,目前是序列化(請參閱我以前的[問題](https://stackoverflow.com/questions/45828159/how-to-serialize-an-注入豆))。我讀到在實體中使用注入並不是一個好主意,但是這個實體需要它。另外,在你寫'new MyBean()'的地方,它可以被反序列化或反射代替,對嗎? – Mark
也許你應該考慮一下,如果它是合理的並且有必要給予MyBean它使用Helper完成的責任。有時候,如果你讓一些'Decorator','Adaptor'或者'Iterator'處理那個結構,那麼結構會更好。這些通常是可以通過容器創建的正常範圍的bean,並且可以使用數據對象。 – aschoerk
如果您提供用例,以及實體如何實際依賴這些bean,那麼我們可以幫助將其重構爲更好的設計,而不需要向實體注入。理想情況下,您應該將實體視爲數據,並有一個單獨的bean來處理該數據。 – maress