是否可以将请求范围的 CDI bean 注入到无状态会话 bean 中?
我曾问过一个相关问题,并认为特定的 CDI @RequestScoped 到 @Stateless 问题值得发表。
在 EJB 方法/@RequestScoped 和 @Stateless 之间传递状态
我还问了一个关于 JMS @MessageDriven bean 的类似问题——基本上想知道关于 @Stateless 的相同问题。
是否可以将请求范围的 CDI bean 注入到无状态会话 bean 中?
我曾问过一个相关问题,并认为特定的 CDI @RequestScoped 到 @Stateless 问题值得发表。
在 EJB 方法/@RequestScoped 和 @Stateless 之间传递状态
我还问了一个关于 JMS @MessageDriven bean 的类似问题——基本上想知道关于 @Stateless 的相同问题。
您绝对可以做您提到的事情并@RequestScoped
在@Stateless
会话 bean 和 bean 中使用@MessageDriven
bean。这是 CDI 规范和 TCK 的核心部分,保证可移植。
请注意,有一个@Stateless
使用 bean 的@RequestScoped
bean 的测试,但没有保证@MessageDriven
bean 可以引用@RequestScoped
bean 的测试。这只是一个疏忽,已经为 Java EE 7 TCK 修复了。所以请注意,如果它不适用于 MDB 案例,那可能不是你的错 :)
解决方法是简单地将您的 MDB 委托给任何类型的 SessionBean,如@Stateless
, @Stateful
,并且@Singleton
都具有@RequestScoped
测试。
虽然@Stateless
,@Singleton
和@MessageDriven
可以通过 注入作用域引用@Inject
,但它们不能是 @RequestScoped
或任何其他作用域。只有@Stateful
模型足够灵活以支持范围。换句话说,您可以将@Stateful
bean 类本身注释为@RequestScoped
、@SessionScoped
等。
简单来说@Stateless
,@Singleton
已经固定了“范围”。 @Singleton
本质上是@ApplicationScoped
并且@Stateless
可能是一些虚构的范围@InvocationScoped
,如果存在的话。bean的生命周期@MessageDriven
完全取决于驱动它的连接器,因此也不允许有用户定义的范围。