在方法中,我可能需要生成下载bean来获取文件。当我并行接收这些调用时,我只想下载文件一次。我不知道在JEE / CDI中表达以下伪代码的正确方法:
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();
}
}
我想使用CDI,因为我需要在JNDI变量的下载器上设置属性。每个下载器负责下载文件并保留一些状态。请注意,每个下载器将被赋予不同的状态,因此必须是bean的新实例。
在我放弃CDI之前,将变量注入父类,然后使用标准java和一些静态来实例化上面的内容,是否有一个"正确的"用CDI实现这一目标的方法?
答案 0 :(得分: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);
}
}
您的下载bean必须位于@Dependent
范围内。