对范围,ejbs和托管bean有一些疑问。
在我的申请中,我们有:
@ApplicationScoped
public class MyClass implements MyNonSerializableInterface {
@Inject
private transient NonSerializableLogger transientLogger;
@Inject
private NonSerializableLogger logger;
...
}
和一些经理:
@Singleton
public class SomeManager {
@Inject private MyClass myClass;
}
和一个网络服务:
@Path("some")
public class SomeWebService {
@Inject private SomeManager;
}
容器(部署时间)或编译器没有抱怨它,这是正常的吗?
我想:
“使用会话,应用程序或会话范围的Bean必须是可序列化的,但使用请求范围的bean不必是可序列化的。”JAVA EE Using Scopes
MyClass应该实现Serializable与否?我们可以说因为托管bean被注入@Singleton,序列化永远不会发生吗?因此,在部署时没有显示序列化错误?
答案 0 :(得分:1)
CDI范围在CDI容器的上下文中进行评估。也就是说,CDI规范的设计者确保它可以与EJB和jsf Managed Bean一起使用。那就是说。
CDI范围理想情况下是对使用情况敏感的。 @ApplicationScoped意味着CDI bean应该从它创建的实例到应用程序的末尾。它由CDI容器管理,与EJB bean完全无关。但由于与EJB的互操作性,可以将其注入(@Inject)到EJB @Singleton bean中。 EJB规范和CDI规范中没有要求@Singleton bean或@ApplicationScope bean可序列化。由于这是一个应用程序范围的实例,因此不需要钝化。
@SessionScope使用当前容器所希望的会话的语义。例如,在jsf应用程序中,它通常将作用于HttpSession的生命周期,但在没有HttpSession的EJB容器中,容器不会附加任何有意义的会话sematics。它可能决定是每个@Stateless交易或它所希望的任何事情。由于会话可以序列化,因此规范通常要求@SessionScoped bean可序列化,但定义注入点的bean(如果不是@SessionScoped)不需要可序列化。
@RequestScope也遵循单个执行" atomic"的语义。行动,例如HttpRequest的。在Web容器中,它通常与HttpRequest相关联,并且不要求它可序列化。在非Web上下文中,它可以与每次调用相关联,甚至可以与事务边界相关联(在注入EJB的情况下),或者在注入点处默认为@Dependent范围,此时不能归因于有意义的范围。 / p>
也就是说,任何CDI bean都可以注入到任何EJB bean中。通常在与Web容器无关的EJB容器中,@ Dependent和@ApplicationScope是唯一具有任何有意义用法的范围。