JAX-RS资源(使用@Path注释的类)具有每请求的默认生命周期。
现在EJB也有自己的生命周期,我的意思是当引用EJB时,这个引用实际上是管理EJB池的代理对象的引用。
当EJB也是JAX-RS资源时,这些生命周期模型如何共存?
https://jersey.java.net/documentation/latest/jaxrs-resources.html
默认情况下,JAX-RS资源在每个请求范围内进行管理 表示为每个请求创建新资源。
源: https://jersey.java.net/documentation/latest/jaxrs-resources.html
答案 0 :(得分:1)
JAX-RS与Enterprise JavaBeans技术(企业bean)配合使用 和Java EE的上下文和依赖注入(CDI)。
通常,要使JAX-RS与企业bean一起使用,您需要 使用@Path注释bean的类以将其转换为根 资源类。您可以将@Path注释与无状态一起使用 会话bean和单例POJO bean。
JAX-RS和CDI的组件模型略有不同。默认情况下, JAX-RS根资源类在请求范围内进行管理,但不是 指定范围需要注释。 CDI托管bean 可以转换使用@RequestScoped或@ApplicationScoped进行注释 到JAX-RS资源类。
对于使用注入另一个bean类的bean的Web应用程序,bean需要能够在用户与应用程序交互的持续时间内保持状态。定义此状态的方法是为bean提供范围
@RequestScoped:用户在单个HTTP请求中与网络应用程序的互动。
@SessionScoped:用户跨多个HTTP与Web应用程序的交互 请求。
@ApplicationScoped:所有用户与网络应用程序交互的共享状态。
@Dependent:默认范围(如果未指定);它意味着一个对象 存在只服务于一个客户端(bean)并具有相同的生命周期 作为客户端(bean)。
@ConversationScoped:用户与servlet的交互,包括JavaServer Faces 应用。会话范围存在于 开发人员控制的边界,将其扩展到多个边界 请求长时间对话。所有长期运行 会话的范围限定为特定的HTTP servlet会话 不跨越会话边界。
回答你的问题,正如你可以在另一个内部执行上下文和依赖注入一样,每个bean将独立地管理自己的状态。根据您要执行的角色,您必须为其定义范围。
https://docs.oracle.com/javaee/7/tutorial/jaxrs-advanced004.htm https://docs.oracle.com/javaee/7/tutorial/cdi-basic008.htm#GJBBK
答案 1 :(得分:0)
EJB提供的是每个客户端请求和事务的单个专用线程。 例如,您可以将每个无状态bean视为一个线程实例,该实例用等待提供请求的(注入)数据进行实例化。 当创建bean时,将发生注入,并且在每次方法调用(在您的情况下为REST)之后,将返回池以供重用或销毁。 因此,REST"每个请求的默认生命周期"和SLSB生命周期。