如果我们有 statless bean,那么它可以通过 @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 的整个生命周期中,我们将只有一个 LongTimeService bean 实例。从 ejb 容器的角度来看,当 web 容器将使用 bean 构造 Servlet 时,它会从 ejb 容器中请求实例,并将保留此实例,直到 servlet 被销毁并且每个 servlet 请求只能与一个实例一起使用。我认为这是使用 Statless EJB 的不好方法,因为它不是为这种用途而创建的。对于这个 perpes 例如有用的@Singleton statfull bean。但是如果我们想使用无状态 bean,那么我们可以每次在方法内部从 Context 中查找这个 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;
...
}
}
使用这种方法是否正确且可能?