天天看點

CDI技術第四步,依賴作用域與作用域總結

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。

結果是兩個對象記憶體位址并不一樣。

CDI技術第四步,依賴作用域與作用域總結

如果是Request作用域的Bean,這兩次注入絕對是同一對象。

我們再來總結一下,我們将作用域從小到大進行一個排列。

Dependent,對象賊多,要一個就new一個對象。

RequestScoped,對于每個HTTP請求,維護一個對象。

ConversationScoped,預設與RequestScoped一緻,但是如果開始了會話,并将cid傳遞過去,那麼就可以在多個HTTP請求共享一個對象。

SessionScoped,對于每個Http Session,維護一個對象。

ApplicationScoped,對于每個web應用,維護一個對象。