我有点困惑,我们将 CDI bean 称为使用@Inject
注释注入它们的 bean 还是我们@Inject
在其中使用的 bean?
5 回答
CDI bean是 CDI 可以自动实例化、管理和注入以满足其他对象的依赖关系的类。几乎任何 Java 类都可以由 CDI 管理和注入。
例如,PrintServlet 依赖于 Message 实例,并由 CDI 运行时自动注入。
PrintServlet.java
@WebServlet("/printservlet")
public class PrintServlet extends HttpServlet {
@Inject private Message message;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.getWriter().print(message.get());
}
}
Message.java(这个类是一个 CDI bean)
@RequestScoped
public class Message {
@Override
public String get() {
return "Hello World!";
}
}
干杯!
CDI没有引入一种称为CDI Bean的新 bean 类型,它具有自己独特的组件模型。
CDI提供了一组服务,这些服务可由托管 bean 和由其现有组件模型定义的 EJB 使用。
因此,CDI 只是一个处理 CDI 生命周期的 Bean(EJB 或托管 Bean),具有Context和其他旧功能DI的范围。
CDI bean
是由CDI container
(例如 Weld)管理的 bean。
如果是
@injected
- 它是 bean如果它是可能的
@injects
东西 - 它也是豆子。
CDI 在 Java EE 6 中被引入,以提供一些早期可用于 EJB 的功能,仅适用于由容器管理的所有组件。因此 CDI bean 涵盖了 Servlet、SOAP Web 服务、RESTful Web 服务、实体、EJB 等。
因此,您可以互换使用所有这些术语:
- CDI豆
- 豆
- 托管豆
- EJB bean
- 容器管理 bean 等
我认为这个术语CDI bean
在技术上可能不正确。托管 bean 似乎更合适。
但是,CDI bean的可能定义可能是:由于类上存在 CDI 注释或存档中存在文件而创建和注入的任何托管 bean。CDI bean 本身不是一个类,而是一个类的托管实例。beans.xml
例如下面的例子:
public class Logger{}
public class Producer {
@Produces
public Logger getLogger() {
return new Logger();
}
}
Logger
本身只是一个类。它在被生产者实例化并绑定到上下文后变为managed bean
( )。CDI bean
CDI bean 只能存在于容器中。容器需要实现CDI
规范。它扫描部分或全部类路径以查找 CDI 注释,并根据这些注释创建和管理相应的 bean。
从独立应用程序创建启用 CDI 的容器就像这样简单:
WeldContainer container = new Weld().initialize();