【问题标题】:What is a CDI bean?什么是 CDI bean?
【发布时间】:2013-03-09 08:42:50
【问题描述】:

我有点困惑,我们将 CDI bean 称为使用 @Inject 注释注入它们的 bean 还是我们在其中使用 @Inject 的 bean?

【问题讨论】:

  • 您是否阅读了一些关于它的手册/常见问题解答?你在什么情况下使用它?你读过docs.oracle.com/javaee/6/tutorial/doc/giwhl.html 吗?你是否知道这是 java-ee,因为我重新标记了它。
  • 我说的是 Jboss Weld

标签: java jakarta-ee cdi


【解决方案1】:

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!";
    }
}

干杯!

【讨论】:

    【解决方案2】:

    CDI 不引入一种称为 CDI Bean 的新 bean 类型,其 拥有独特的组件模型。

    CDI 提供一组服务,这些服务可以由由其现有组件模型定义的托管 bean 和 EJB 使用。

    因此,CDI 只是一个处理 CDI 生命周期的 Bean(EJB 或托管 Bean),其范围适用于 Context 和其他旧功能 DI

    【讨论】:

    • 我不认为这是真的 - afaik 有一个 CDI bean 这样的东西,它不同于一个完全成熟的 EJB bean。例如,CDI bean 不会自动进行事务处理(这是 EJB 获得的东西)。
    【解决方案3】:

    CDI bean 是由CDI container 管理的 bean(例如 Weld)。

    • 如果是@injected - 它是bean

    • 如果可能是@injects 什么东西——它也是豆子。

    【讨论】:

      【解决方案4】:

      CDI 在 Java EE 6 中被引入,以提供一些早期 EJB 可用的特性,只提供给容器管理的所有组件。所以 CDI bean 涵盖了 Servlet、SOAP Web 服务、RESTful Web 服务、实体、EJB 等。

      所以你可以互换使用所有这些术语:

      • CDI 豆
      • 豆子
      • 托管 bean
      • EJB bean
      • 容器管理的 bean 等

      【讨论】:

        【解决方案5】:

        我认为CDI bean 这个词在技术上可能不正确。 托管 bean 似乎更合适。

        但是,CDI bean 的可能定义可能是:由于存在 CDI 注释而创建和注入的任何 托管 bean strong> 在类上或由于存档中存在beans.xml 文件。 CDI bean 本身不是一个类,而是一个类的托管实例。

        例如举个例子:

        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();
        

        【讨论】:

          猜你喜欢
          • 2013-09-05
          • 2012-05-04
          • 2014-01-08
          • 2013-03-03
          • 1970-01-01
          • 2012-01-12
          • 1970-01-01
          • 2015-04-20
          相关资源
          最近更新 更多