使用CDI复制Seam工厂功能

时间:2013-09-24 20:07:26

标签: java caching jsf-2 cdi seam2

我试图在CDI中找到Seam 2 Factory范例的模拟。我在过去的项目中广泛使用了components.xml中的工厂注释方法和工厂定义。通常我将它们用作一种缓存,当我知道缓存是陈旧的时,我从上下文中删除组件,并且下次需要Factory时工厂方法将再次运行。

例如,在生产应用程序中,我们列出了每年更新的可用药物。此列表在应用程序中广泛使用,因此我们使用Factory注释应用程序作用域方法将其缓存在内存中。

@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的新手,所以我可能错过了一些技巧。

0 个答案:

没有答案