在方法

时间:2016-02-05 05:13:07

标签: java java-ee javabeans cdi

在方法中,我可能需要生成下载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实现这一目标的方法?

1 个答案:

答案 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范围内。