在本教程中,我们将向您展示如何在CDI管理的Bean中实现依赖注入。 特别是,我们将利用CDI API提供的@Inject批注将CDI bean注入另一个bean。 这样,可以在应用程序(例如JavaServer Faces应用程序)中使用bean。

CDI提供了几种将Bean注入应用程序的方法。 我们可以使用字段依赖注入,构造函数依赖注入或通过setter方法的依赖注入来注入CDI bean。 我们还可以注入生产者方法的参数,但这超出了本教程的范围。 让我们检查一下CDI提供的所有注入方式:

1.字段依赖注入

注入CDI bean的最简单方法是在要注入的属性中添加@Inject批注。 让我们看下面的例子。 GreetingBean有一个@Inject注释字段,它是helloBean 。 这样,另一个bean HelloBean被注入GreetingBean

package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.inject.Inject;public class GreetingBean {@Inject private HelloBean helloBean;}

2.构造函数依赖注入

初始化CDI bean时,容器将使用其默认构造函数。 如果有另一个带有@Inject注释的构造函数,则容器将自动使用该构造函数,这样,构造函数中传递的参数将被注入Bean中。 这里要注意的是,我们只能有一个构造函数注入点。 如果我们创建另一个@Inject注释的构造函数,则容器的行为是不可预测的。

GreetingBean下方的代码段中,有一个构造函数,该构造函数带有@Inject注释和一个参数,即另一个bean HelloBean 。 以这种方式实现注射。

package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.inject.Inject;public class GreetingBean {private final HelloBean helloBean;@Injectpublic GreetingBean(HelloBean helloBean){this.helloBean = helloBean;}}

3.通过setter方法进行依赖注入

在下面的示例中,使用@Inject注释对setHelloBean(HelloBean helloBean)方法进行注释。 因此,当GreetingBean由容器初始化时,将调用该方法,因为该方法带有@Inject注释,并且将注入HelloBean

package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.inject.Inject;public class GreetingBean {private HelloBean helloBean;@Injectpublic void setHelloBean(HelloBean helloBean) {this.helloBean = helloBean;}
}

4.使用@Any限定词

当我们对一个接口有多种实现,并且希望将它们全部注入到另一个bean中时,可以使用@Any限定符。 使用此注释,容器将注入指定接口的所有实现。 它与CDI API提供的javax.enterprise.inject.Instance接口一起使用,如下面的代码片段所示:

package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;public class GreetingBean {@Injectpublic void getAllBeanImplementations(@Any Instance<HelloBean> beans) {for (HelloBean helloBean : beans) {System.out.println(helloBean.getClass().getCanonicalName());}}
}

在这里我们必须注意,如果有多个依赖关系满足一个注入点,并且我们将不使用@Any限定符,而是尝试注入一个,那么容器将失败。

5.使用代理进行注射

为了将托管bean注入到另一个bean中(除@Dependent注释的bean之外),CDI容器不会传递对注入的bean本身的引用,而是传递给代理的引用。 代理透明地处理对注入的bean的所有调用。 例如,当我们将SessionScoped bean注入ApplicationScoped bean并且许多客户端访问ApplicationScopedBean ,代理将被用来处理对注入的bean的调用。 每个代理都可以将调用重定向到正确的bean。

最后,请注意,通过扩展Bean类并覆盖所有非自变方法来创建CDI代理。 原始类型不能被注入。 Bean类必须具有非私有的默认构造函数,并且不能为final,也不能具有final方法。
这是使用@Inject批注的CDI托管Bean中的依赖注入的教程。

翻译自: https://www.javacodegeeks.com/2013/05/java-ee-cdi-dependency-injection-inject-tutorial.html

Java EE CDI依赖注入(@Inject)教程相关推荐

  1. Java EE CDI依赖关系消歧示例

    在本教程中,我们将向您展示如何避免CDI bean中的依赖关系消除歧义. 在CDI中,我们可以为应用程序中不同客户端的接口的多个实现实现依赖项注入. 依赖关系消除歧义的问题是客户端如何在不同的实现中调 ...

  2. java ee cdi_Java EE CDI依赖注入(@Inject)教程

    java ee cdi 在本教程中,我们将向您展示如何在CDI管理的Bean中实现依赖注入. 特别是,我们将利用CDI API提供的@Inject批注将CDI bean注入另一个bean. 通过这种方 ...

  3. java ee cdi_Java EE CDI依赖关系消歧示例

    java ee cdi 在本教程中,我们将向您展示如何避免CDI bean中的依赖关系消除歧义. 在CDI中,我们可以为应用程序中不同客户端的接口的多个实现实现依赖项注入. 依赖性消除歧义的问题是客户 ...

  4. Java EE CDI Producer方法教程

    这是CDI Producer方法的教程. 在CDI中,生产者方法生成一个可以注入的对象. 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同,或者当对象需要一些bean构造 ...

  5. Java EE CDI处理程序方法示例

    这是CDI Disposer方法的教程. 在CDI中,由于Producer方法生成的对象随后可以注入到应用程序中,因此使用Disposer方法,以便在其工作完成时将其删除. Disposer方法始终与 ...

  6. Java EE CDI ConversationScoped示例

    在本教程中,我们将向您展示如何在Web应用程序中创建和使用ConversationScoped Bean. 在CDI中,bean是定义应用程序状态和/或逻辑的上下文对象的源. 如果容器可以根据CDI规 ...

  7. Java EE CDI程序化依赖关系消歧示例–注入点检查

    在本教程中,我们将看到在注入Java EE CDI bean时如何避免程序依赖消除歧义. 我们已经在Jave EE依赖关系消除歧义示例中展示了如何避免CDI Bean中的依赖关系歧义消除. 在这里,我 ...

  8. 在ABAP里模拟实现Java Spring的依赖注入

    Dependency Injection- 依赖注入,在Java Spring框架中有着广泛地应用.通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便. 那么ABAP能否从语言层面上也 ...

  9. Java EE CDI限定词:快速浏览

    在上下文和依赖注入(CDI)中, 限定符是类型安全和松散耦合的主体. 为什么? 没有CDI,我们将以类似于下面的方式注入Java EE组件 注意:这实际上不会编译,只是假设的代码片段 例子1 例子2 ...

最新文章

  1. OpenCV中的内存泄漏检测
  2. 如何获得images.xcassets 中图片的路径?
  3. [20160311]ora-01732.txt
  4. geoserver css插件,GeoServer使用CSS定义地图样式-上手
  5. python threading 多线程
  6. 【Laravel】Fatal error: Declaration of Illuminate\Container\Container::get($id) must be compatible
  7. Python的发展方向
  8. 服务器字体指定 iconfont 字体的下载与使用 200303
  9. EasyUI:datagrid冻结表头
  10. 除了php云和骑士还有什么_骑士CMS是什么开源程序
  11. 暗时间 pdf_时间管理最全的一篇:理论+实践+电子书
  12. SeaweedFS安全配置(Security Configuration)
  13. 软件测试工作总结(二)
  14. 一次CNVD-2020-10487漏洞利用
  15. PHP合并两张(多张)图片
  16. 线程的同步和异步理解
  17. 2006考研阅读Text2翻译
  18. 紫光武汉新芯珠联璧合 引领存储“芯”篇章
  19. 此文让你至少走三年弯路
  20. Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 a

热门文章

  1. python django 是啥_python的django做什么的
  2. mybatis_user_guide(4) Mapper XML 文件
  3. java中的可检查和不检查_检查Java测试中发生了什么
  4. jdk 9和jdk8_JDK 9已完成功能!
  5. junit5和junit4_JUnit 5 –下一代JUnit的初步了解
  6. osgi cxf_所有OSGi套件的通用CXF请求拦截器
  7. JAR文件句柄:烦恼后清理!
  8. 通过READ-BEHIND CACHE来控制缓慢的生产者
  9. Spring MVC – HTTP消息转换器
  10. input发送a.jax_JAX-RS 2.0:自定义内容处理