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应用,维护一个对象。