gpt4 book ai didi

java - 桌面应用程序中的 CDI

转载 作者:行者123 更新时间:2023-11-29 04:35:39 25 4
gpt4 key购买 nike

我正在创建一个可供 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 将仅适用于桌面,我不想这样做。

最佳答案

正如用户 MouseEvent 在评论中所说,通常最好为此使用两个单独的 JAR。

但是,我要回答的是您关于非网络环境中的 @RequestScoped bean 的问题(以及 @Session@Application).那么假设我们在 SE 环境中使用 Weld - 现在,什么有效,什么无效?

  • @ApplicationScoped 工作得很好并且如您所料。每个应用程序一个 bean。它的生命周期在您启动容器时开始,在您关闭容器时停止。另一种方法是使用 @javax.inject.Singleton(注意这是 CDI singleton,而不是 EJB)bean,但这应该仅限于 SE - 这与应用程序范围的 bean 的行为相同但没有创建代理。在某些情况下,这可能会让您占上风,但也会阻止诸如序列化之类的事情。

  • @SessionScoped 目前在 SE 环境中不起作用,因为它在那里没有任何意义。正如您自己所说,那里没有 session 。

  • @RequestScoped 在 SE 中工作。这是有道理的,因为“请求”可能意味着比普通的旧 HTTP 请求更多的东西。但是,您需要注意激活此范围。虽然有几种方法(例如扩展上下文和自己处理激活),但我建议使用 Weld API 中提供的注释(实际上是拦截器绑定(bind))- @ActivateRequestContext .您只需将注释放在您的方法之上,Weld 将在方法启动之前激活请求上下文,然后将其关闭。你也可以把它放在整个类(class),这意味着它适用于每一种方法。请注意,您需要依赖 Weld API 才能访问此注释(或者您需要在 was added as well 中使用 CDI 2.0)。

至于你的依赖,在SE环境下,你会想要这个:

<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se</artifactId>
<version>2.4.1.Final</version>
</dependency>

关于java - 桌面应用程序中的 CDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41709859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com