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