我正在创建一个可以由WEB或DESKTOP应用程序使用的JAR。这个JAR应该有一些带有@RequestScoped和其他CDI注释的类,所以我对它有一些疑问:
1)我知道@RequestScoped仅适用于HTTP REQUEST,但我如何在桌面应用程序中使用它?这是可能的 ? 2)我正在使用这种依赖:
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.4.1.Final</version>
</dependency>
但是这种依赖只适用于WEB的焊接,我需要一些更通用的,应该在WEB或DESKTOP中工作。
如果我使用“weld-se”作为依赖,我的JAR只能用于DESKTOP,我不想这样做。
答案 0 :(得分:3)
正如用户MouseEvent在评论中所说的那样,通常最好有两个单独的JAR。
但是,我的目标是回答您关于非网络环境中@RequestScoped
bean的问题(以及@Session
和@Application
)。因此,假设我们在SE环境中使用 Weld - 现在,哪些有效,哪些无效?
@ApplicationScoped
正常运作,正如您所料。每个应用程序一个bean。它会在您启动容器时启动生命周期,在您关闭容器时停止。另一种方法是@javax.inject.Singleton
的使用(请注意,这是CDI singleton,而不是EJB)bean,但这应该仅限于SE - 这与应用程序作用域bean的行为相同,但没有创建代理。在某些情况下,这可能会让你占上风,但也会阻止像序列化这样的事情。
@SessionScoped
目前在SE 环境中不起作用,因为它在那里没有任何意义。正如你自己说的那样,你没有会话。
@RequestScoped
在SE中有效。这是有道理的,因为“请求”可能意味着更多的东西而不仅仅是普通的旧HTTP请求。但是,您需要注意激活此范围。虽然有几种方法(例如扩展上下文和自己处理激活),但我建议使用Weld API中提供的注释(实际上是拦截器绑定) - @ActivateRequestContext
。您只需将注释放在方法的顶部,Weld将在方法启动之前激活请求上下文,然后将其关闭。您也可以将它放在整个类中,这意味着它将适用于每个方法。请注意,您需要依赖Weld API才能访问此注释(或者您需要使用CDI 2.0,其中was added as well)。
至于你的依赖关系,在SE环境中,你会想要这个:
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se</artifactId>
<version>2.4.1.Final</version>
</dependency>