【问题标题】:Create multiple instances of beans during method在方法期间创建多个 bean 实例
【发布时间】:2016-02-05 05:13:06
【问题描述】:

在一个方法期间,我可能需要生成一个下载 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 实现这一点?

【问题讨论】:

    标签: java jakarta-ee javabeans cdi


    【解决方案1】:

    如果你使用的是 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 范围内。

    【讨论】:

    • 那么 Instance 每次都保证是一个新的实例,并且会一直保持在作用域内,直到给定的方法用完它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多