2016-02-05 57 views
0

在方法中,我可能需要生成一個下載bean來獲取文件。由於我並行接收這些電話,我只想下載一次該文件。我不知道要表達JEE/CDI下面的僞代碼的正確方法:在方法中創建bean的多個實例

if (download_required) { 
    monitor.enter(); 
    if (!map.ContainsKey(downloadPath)) 
    { 
     //CDI inject new instance of downloader here. 

     downloader.File = downloadPath; 
     downloader.startDownload(); 
     map.put(downloadPath, downloader); 
     monitor.exit(); 
     downloader.waitForDownload(); 
    } else { 
     monitor.exit(); 
     map.get(downloadPath).waitForDownload(); 
    } 
} 

我想,因爲我需要從JNDI變量下載器設置屬性使用CDI。每個下載器負責下載文件並保留一些狀態。請注意,每個下載器將被賦予不同的狀態,因此必須是該bean的新實例。

就在我放棄CDI之前,將變量注入到父類中,然後使用標準java和一些靜態來實例化上述內容,是否有一種「正確」的方式來實現CDI?

回答

2

如果您使用的是Java EE7,你可以使用javax.enterprise.inject.Instance

@Inject Instance<Download> downloadProvider; 

public void yourMethod() { 
    Download download = downloadProvider.get(); 
    try { 
     // do something with your download instance 
    } finally { 
     downloadProvider.destroy(download); 
    } 
} 

您的下載豆必須在@Dependent範圍。

+0

所以實例<>保證每次都是一個新的實例,並且將保持在範圍內,直到給定的方法完成它爲止? – Spence