来源于官方文档: https://javaee.github.io/tutorial/cdi-basic001.html
上下文和依赖注入(CDI)使您的对象能够自动为它们提供依赖项,而不是创建它们或将它们作为参数接收。CDI还为您管理这些依赖项的生命周期。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@WebServlet("/cdiservlet")
public class NewServlet extends HttpServlet {
private Message message;
@Override
public void init() {
message = new MessageB();
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.getWriter().write(message.get());
}
}
|
这个servlet需要一个实现Message接口的对象实例 :
|
1
2
3
|
public interface Message {
public String get();
}
|
|
1
2
3
4
5
6
7
8
|
public class MessageB implements Message {
public MessageB() { }
@Override
public String get() {
return "message B";
}
}
|
使用CDI,这个servlet可以声明它对Message 实例的依赖性,并让它由CDI运行时自动注入。新的servlet代码如下:(详细分析此段代码)
|
1
2
3
4
5
6
7
8
9
|
@WebServlet("/cdiservlet")
public class NewServlet extends HttpServlet {
@Inject private Message message;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.getWriter().write(message.get());
}
}
|
CDI运行时查找实现Message 接口的MessageB类,查找类,创建它的新实例,并在运行时将其注入servlet。要管理新实例的生命周期,CDI运行时需要知道实例的范围应该是什么。在此示例中,servlet仅需要实例来处理HTTP请求; 然后可以对实例进行垃圾回收。这是使用javax.enterprise.context.RequestScoped 注释指定的:
|
1
2
|
@RequestScoped
public class MessageB implements Message { ... }
|
该MessageB类是一个CDI bean。CDI bean是CDI可以自动实例化,管理和注入以满足其他对象的依赖关系的类。几乎所有Java类都可以由CDI管理和注入。
原文:https://www.cnblogs.com/ren9ie/p/10962557.html