2016-02-05 26 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