CDI技術第四步:依賴作用域
Dependent作用域是比request作用域還小的作用域,都不能保證每個request内的唯一。簡單地說就是要一個就new一個。
我簡單地舉個例子。
這個是servlet
package cdiscope.web;
import java.io.IOException;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cdiscope.bean.DependentService;
@WebServlet("/dependent.html")
public class DependentServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject
private DependentService service1;
@Inject
private DependentService service2;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append("The service 1 is " + service1).append("\nThe service 2 is " + service2);
}
}
這裡注入了兩個@Dependent注解的Bean。
結果是兩個對象記憶體位址并不一樣。
如果是Request作用域的Bean,這兩次注入絕對是同一對象。
我們再來總結一下,我們将作用域從小到大進行一個排列。
Dependent,對象賊多,要一個就new一個對象。
RequestScoped,對于每個HTTP請求,維護一個對象。
ConversationScoped,預設與RequestScoped一緻,但是如果開始了會話,并将cid傳遞過去,那麼就可以在多個HTTP請求共享一個對象。
SessionScoped,對于每個Http Session,維護一個對象。
ApplicationScoped,對于每個web應用,維護一個對象。