java ee cdi_Java EE CDI依赖注入(@Inject)教程
java ee cdi
在本教程中,我们将向您展示如何在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
java ee cdi_Java EE CDI依赖注入(@Inject)教程相关推荐
- Java EE CDI依赖注入(@Inject)教程
在本教程中,我们将向您展示如何在CDI管理的Bean中实现依赖注入. 特别是,我们将利用CDI API提供的@Inject批注将CDI bean注入另一个bean. 这样,可以在应用程序(例如Java ...
- java ee cdi_Java EE6 CDI,命名组件和限定符
java ee cdi Java EE6的最大承诺之一就是简化了依赖注入的使用. 他们做到了,使用CDI . CDI代表Java EE的上下文和依赖注入,它提供了一个基础集,用于在企业应用程序中应用依 ...
- java ee cdi_Java EE CDI依赖关系消歧示例
java ee cdi 在本教程中,我们将向您展示如何避免CDI bean中的依赖关系消除歧义. 在CDI中,我们可以为应用程序中不同客户端的接口的多个实现实现依赖项注入. 依赖性消除歧义的问题是客户 ...
- java ee cdi_Java EE CDI限定词:快速浏览
java ee cdi 在上下文和依赖注入(CDI)中, 限定符是类型安全和松散耦合的主体. 为什么? 没有CDI,我们将以类似于下面的方式注入Java EE组件 注意:这实际上不会编译,只是假设的代 ...
- java ee cdi_Java EE CDI处理程序方法示例
java ee cdi 这是CDI Disposer方法的教程. 在CDI中,由于Producer方法生成的对象随后可以注入到应用程序中,因此使用Disposer方法,以便在其工作完成时将其删除. D ...
- java ee cdi_Java EE CDI Producer方法教程
java ee cdi 这是CDI Producer方法的教程. 在CDI中,生产者方法生成一个对象,然后可以将其注入. 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同 ...
- java ee cdi_Java EE CDI ConversationScoped示例
java ee cdi 在本教程中,我们将向您展示如何在Web应用程序中创建和使用ConversationScoped Bean. 在CDI中,bean是定义应用程序状态和/或逻辑的上下文对象的源. ...
- java ee cdi_Java EE CDI bean范围
java ee cdi Java EE平台的上下文和依赖注入(CDI)是一项功能,有助于将Java EE平台的Web层和事务层绑定在一起. CDI是一组服务,可以一起使用,使开发人员可以轻松地在Web ...
- Java程序员进阶——Spring依赖注入原理分析
Spring依赖注入原理分析 下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI: 平时,我们需要生成一个对象,使用new语法,如一个类为A public class A{public v ...
最新文章
- 【每日训练】2020/11/8(规律 + 二进制、单调栈 + 前缀和,后缀和、bitset + 枚举)
- Unity2D游戏开发基础教程1.2项目、资源和场景
- 盛大游戏式管理,什么时候能管理游戏式?^o^
- 关于《计算机程序的构造和解释》
- nginx+tomcat的负载均衡
- c语言我国有13亿人口,计算机二级循环结构课件.ppt
- 微信支付H5支付开发文档
- 读书推荐:2017 第一期
- SDK 和 API 有什么区别
- 朴素贝叶斯常见面试题
- JAVA开发常见单词(*)
- spa计算机技术,Spathis, Promethee
- c语言编程阿拉伯数字转中文,阿拉伯数字到中文大写数字的转换
- Java命令行开关_java命令行操作
- TB6612FNG电机驱动模块的简单使用
- 利用H5的canvas画一个时钟
- Debug Error: abort() has been called解决办法
- 在新的一年,真心祝愿朋友平安幸福快乐安康!-间歇博客
- 外边距塌陷问题及其对策
- mars3d基于vue3.0的widget使用
热门文章
- JS中令人发指的valueOf方法介绍
- 深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题
- 将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的空间。表中不允许又重复的数据
- mybatis中,collection配置后查询只显示一条记录
- jQuery动画与事件概念以及语法
- React中的方法调用
- SpringCloud Config 分布式配置
- 作为 IT 行业的过来人,你有什么话想对后辈说的?
- java中configmanager_Spring4新的javaConfig注解
- 成人教育计算机统考分数查询江苏省,江苏省教育考试院查询