我试图在 CDI 中找到类似于 Seam 2 Factory 范例。在过去的项目中,我在 components.xml 中广泛使用了工厂注释方法和工厂定义。通常我将它们用作一种缓存,当我知道缓存过时时,我会从上下文中删除组件,工厂方法将在下次需要工厂时再次运行。
例如,在生产应用程序中,我们拥有每年更新的可用药物列表。此列表在应用程序中广泛使用,因此我们使用工厂注释的应用程序范围方法将其缓存在内存中。
@Factory(scope = ScopeType.APPLICATION, autoCreate = true, value = "meds")
public List<Medications> buildMedsList(){
///....Do work to parse, index and build list
}
上传新列表后,我们只需从应用程序上下文中删除“meds”对象,然后访问它以确保它被缓存
Contexts.getApplicationContext().remove("meds");
Component.getInstance("meds");
有很多行为相似的列表/对象。提供从单选按钮组的 SelectItem 列表到对话框消息文本和最终用户许可文本的所有内容。所有这些都具有非常长的生命周期,但需要在不重新启动应用程序服务器的情况下进行更新。我还对一些具有未知生命周期的会话范围变量使用相同的技术(可能需要根据用户交互进行刷新)。
到目前为止,我看到 CDI Producer 与 Factory 非常相似,但我看不出它如何以与我使用 Seam 2 Equivalent 的方式相似的方式使用,而无需为每个工厂构建包装类。此外,我看不到从 CDI 上下文中删除内容的方法。因此,如果没有我发明的一些特殊范围,我就不能拥有这些任意长寿命的对象。
我对 CDI 完全陌生,所以我可能缺少一些技术。