Java 针对Servlet中上下文查找的EJB注入
若我们有无statlesbean,那个么它可以通过@EJB注释注入Servlet。例如:Java 针对Servlet中上下文查找的EJB注入,java,jakarta-ee,servlets,ejb,Java,Jakarta Ee,Servlets,Ejb,若我们有无statlesbean,那个么它可以通过@EJB注释注入Servlet。例如: @Stateless public class LongTimeService { public void do() { //logic } } public class ServletWithBean extends HttpServlet { @EJB private LongTimeService bean; @Override
@Stateless
public class LongTimeService {
public void do() {
//logic
}
}
public class ServletWithBean extends HttpServlet {
@EJB
private LongTimeService bean;
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
bean.do;
...
}
}
在这种情况下,在Servlet的整个生命周期中,我们只有一个LongtimeServicebean实例。从ejb容器的角度来看,当web容器将用bean构造Servlet时,它将从ejb容器中请求实例,并将保留该实例,直到Servlet被解压,并且每个Servlet请求将仅与一个实例一起工作。
我认为这是一种使用无状态EJB的糟糕方法,因为它不适合这种使用。例如,对于这一点,可以使用@Singleton statfull bean。
但是,如果我们想使用无状态bean,那么每次在方法内部都可以从上下文中查找这个bean的实例
public class ServletWithBean extends HttpServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
Context ctx = new InitialContext();
LongTimeService bean = context.lookup("LongTimeService");
bean.do;
...
}
}
使用这种方法是否正确且可行
从ejb容器的角度看,web容器何时构造
Servlet和bean,它从ejb容器中请求实例,并将保留
此实例直到servlet被销毁,并且每个servlet请求
将仅适用于一个实例
您的推理是正确的,但是,注入servlet类成员的实例实际上是名为Stub或Proxy的对象的实例,它实际上不是EJB实例
基本上,每次从servlet调用ejb的方法时,存根都会向ejb容器请求对ejb的引用,容器将从池中获得一个可用的ejb,该ejb将处理该请求,一旦完成任务,它将返回池中
因此,如果servlet同时处理多个请求,那么存根将为每个请求获得不同的ejb引用
请注意,存根对象实现需要是线程安全的(对于无状态bean来说也是如此)
我认为这是使用无状态EJB的糟糕方法,因为它不会创建
对于这种用法
根据以上几点,可以从servlet使用@EJB注入
关于查找存根方法:
它也可以工作(每个请求都会得到一个存根),但对于无状态来说,这是不必要的,并且它有一个重要的缺点:查找是一个耗时的操作,因此,您将在服务时响应中获得一个延迟,而无需补偿
我希望这对你有帮助