2012-09-27 59 views
5

我正在使用CDI 1.0的焊接實現,我無法找到如何讓Spring像Spring一樣懶惰的方式(在XML中使用@Lazylazy-init)。有沒有辦法告訴CDI的Injector不要在啓動時初始化bean?如何讓CDI Bean懶惰地初始化?

+0

重複的http://stackoverflow.com/questions/15920758/java-ee-6-inject-lazy –

回答

6

不,這在CDI中是不可能的。您可以得到的最接近的方法是創建一個新的InjectionPoint(使用擴展)實現,該實現提供了一個代理,並且該代理將初始化第一個方法調用中的所有內容。

+0

所以,通過使用@Inject Instance beantypeProvider;這應該是正確的? –

+1

恩,我的第一反應就是說可能有效。雖然如果您使用的是CDI 1.0實現,但實例會泄漏依賴範圍實例的內存。 – LightGuard

+0

你在說什麼實現?你的參考在哪裏? –

4

見我的回答是:http://www.adam-bien.com/roller/abien/entry/lazy_injection_with_javax_inject

使用

@Inject 
Instance<MyObject> object; 

僅在需要時豆初始化......這不就是你想要什麼?

+0

[根據亞當Bien](http://www.adam-bien.com/roller/abien/entry),有一個替代方案是,_might_可以更輕一些:只是注入一個'Provider '而不是'Instance ',其餘的都是一樣的。 –

+1

@HeinBlödAdam Bien的博客中的條目鏈接已更改爲[Lazy Injection with javax.inject.Provider](http://www.adam-bien.com/roller/abien/entry/lazy_injection_with_javax_inject)。 – ltlBeBoy

+0

更新了答案,謝謝 –

0

如果您注入的bean處於正常範圍(@SessionScoped,@RequestScoped等),它將被延遲實例化。您在客戶端bean中獲得的是一個代理,它在第一次調用代理上的方法之前不會指向具體實例。

正如其他人已經指出的,@Inject Instance<MyBean> myBeanInstance;也可以用來建立一個明確的懶惰實例。

相關問題