tl; dr注入servlet的CDI bean如何也可能處於適當的範圍內?CDI bean的servlets和範圍
在官方的oracle教程和一些書中,我們可以看到簡單的例子,顯示瞭如何將CDI bean注入到servlet。這很簡單,因爲我們只需要使用@Inject註釋並在beans.xml中啓用bean發現。我不明白的是,注入到servlet中的bean是否有可能是正確的。 servlet對象只由容器創建一次,所以據我瞭解注入應該只發生一次,或者應該發生一些意外的行爲。但是當我們使用ie時。 @RequestScoped對bean類的注入發生在對這個servlet的每個請求之後(好極了)。問題在於它如何深入工作?
簡單的例子
public interface BeanInterface {
public void beanInfo();
}
-
@RequestScoped
public class BeanImpl implements BeanInterface {
@Override
public void beanInfo() {
System.out.println(this);
}
}
- 發送3個請求/豆URL後
@WebServlet("/bean")
public class BeanServlet extends HttpServlet {
//how is it injected with every GET/POST/... request
@Inject
private BeanInterface bean;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(this);
bean.beanInfo();
}
}
結果我們可以看到,每一次我們得到注入不同豆單個servlet。
23:35:18,062 INFO [stdout] (default task-3) [email protected]
23:35:18,071 INFO [stdout] (default task-3) [email protected]
23:35:23,883 INFO [stdout] (default task-4) [email protected]
23:35:23,887 INFO [stdout] (default task-4) [email protected]
23:35:27,286 INFO [stdout] (default task-5) [email protected]
23:35:27,288 INFO [stdout] (default task-5) [email protected]
'ThreadLocal'如何工作,而它是一個靜態變量? :)類似的概念。 – ZhongYu