Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 针对Servlet中上下文查找的EJB注入_Java_Jakarta Ee_Servlets_Ejb - Fatal编程技术网

Java 针对Servlet中上下文查找的EJB注入

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

若我们有无statlesbean,那个么它可以通过@EJB注释注入Servlet。例如:

@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注入

关于查找存根方法:

它也可以工作(每个请求都会得到一个存根),但对于无状态来说,这是不必要的,并且它有一个重要的缺点:查找是一个耗时的操作,因此,您将在服务时响应中获得一个延迟,而无需补偿

我希望这对你有帮助