Java EE CDI依赖注入(@Inject)教程

在本教程中,我们将向您展示如何在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js 字符串减去字符串_JS去掉字符串前后空格或去掉所有空格的用法

1、 去掉字符串前后所有空格&#xff1a;代码如下&#xff1a;function Trim(str){return str.replace(/(^\s*)|(\s*$)/g, "");}说明&#xff1a;如果使用jQuery直接使用$.trim(str)方法即可&#xff0c;str表示要去掉前后所有空格的字符串。2、 去掉字符串中所有空…

文本强制不换行并隐藏

记录一个简单的css样式&#xff0c;重点&#xff1a;style"width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;",必须要有个宽度&#xff0c;white-space:nowrap;禁止换 行&#xff0c;overflow:hidden;隐藏多余的文本&#xff0c;text-overfl…

服务器性能是什么,什么是服务器性能的显卡,怎么理解?

什么是服务器性能的显卡&#xff0c;怎么理解&#xff1f;如果单说“”二字就是个伪命题&#xff0c;服务分不同的性能级别&#xff0c;有些刀片器的性能甚至还不如某些发烧级的游戏台式机&#xff0c;那它所用的显卡性能也会比较一般&#xff0c;如果是说哪些显卡是专门为服务…

JSON处理的Java API(JSR-353)–流API

Java很快将具有一组标准的API&#xff0c;作为Java EE 7的一部分处理JSON。此标准定义为JSR 353 – JSON处理的Java API &#xff08;JSON-P&#xff09;&#xff0c;目前正在最终批准投票中。 JSON-P提供面向对象和基于流的方法&#xff0c;在本文中&#xff0c;我将介绍流API…

判的质数的三种方法

方法一&#xff1a;bool判断法 Console.Write("q请输入一个数&#xff1a;"); int aint.Parse(Console.ReadLine()); bool isFind false; for (int i 2; i < a - 1; i) {   if (a % i 0)   {     isFind true;     break;   } } if (isFind tr…

记录工作中常用的CSS3

1.边框圆角,边框阴影 border-radius:6px; // border-radius:50%; //圆形 box-shadow: 1px 1px 1px #666; //box-shadow: h-shadow v-shadow blur spread color inset(outset); 2.背景图片的大小 background-size: 100% 100%; //对背景图片进行拉伸&#xff0c;使其完成填充内…

pcb成型板aoi检测_基于AOI技术的PCB常见质量缺陷检测

..优质资料..基于AOI技术的PCB常见质量缺陷检测摘要&#xff1a;印制电路板简称PCB&#xff0c;作为电子元器件的支撑体和电子元器件电气连接的载体&#xff0c;是重要的电子部件&#xff0c;由于它采用的是电子印刷术制作的&#xff0c;所以被称为印制电路板。AOI全称自动光学…

直接从JBoss AS 7组件使用JGroups

JGroups是Bela Ban的用于可靠消息交换的软件&#xff0c;该软件高度可配置&#xff0c;可以使用TCP或UDP作为传输协议。 基本上&#xff0c;您在多个客户端上运行JGroup&#xff0c;它们构成一个集群&#xff0c;它们可以在集群内发送和接收消息。 JGroups由JBoss Infinispan内…

LeetCode(28): 实现strStr()

Easy&#xff01; 题目描述&#xff1a; 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串&#xff0c;在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在&#xff0c;则返回 -1。 示例 1: 输入: haystack "hello"…

vue2.0 配置build项目打包目录、资源文件(assets\static)打包目录

vue项目默认的打包路径&#xff1a;根目录下的dist文件夹下&#xff1b; 但是在项目开发中&#xff0c;我们肯定希望项目提交到svn目录或者git目录下&#xff0c;否则每次复制过去&#xff0c;太麻烦了&#xff1b; 那怎么配置打包路径呢&#xff1f;下面来看看&#xff1b; 我…

打印机网络共享服务器不稳定,共享打印机无法访问怎么办,教你一招问题立马解决...

基本上只有本地打印机共享才会出现下面的问题&#xff0c;通过网线连接和打印机服务器连接的打印机不会出现此类问题&#xff0c;多个电脑连接网络打印机本质上还是各个电脑连接的本地打印机。一、 设置打印机共享时出现错误连接好本地打印机后&#xff0c;想要共享给同事使用&…

css多浏览常见问题

关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下内容没有太多新颖, 纯属个人总结, 希望能对初学者有一定的帮助. 一、CSS HACK 以下两种方法几乎能解决现今所有HACK. 1, !important 随着IE7对!important的支持, !important 方法现在只针对IE6的…

0 win10重装partition_教你在安装WIN10系统中所遇到问题处理方法

光盘安装系统时提示&#xff1a;windows 无法安装到这个磁盘。选中的磁盘采用 GPT 分区形式问题&#xff1a;一般为笔记本光盘安装提示 win7 或 win8系统时 windows 无法安装到这个磁盘&#xff0c;选中的磁盘采用 GPT分区形式。(光盘 PE模式分区后都是主分区&#xff0c;Ghost…

常用matlab函数(不定时更新)

直方图类&#xff1a;histc 直方图分组 示例 histc(a,0:1:10) 意义&#xff1a;将a&#xff08;矩阵或向量&#xff09;分组&#xff0c;分组设置为 0-1 1-2 2-3 ….. 9-10,(10-11)百分位prctile 示例 prctile(a,15) prctile(a,50) prctile(a,75) 意义 求出a向量或矩阵…

Heroku和Java –从新手到初学者,第2部分

问题 所以过了几天&#xff0c;我可以回到我的Recaps小项目。 我从检查日志开始&#xff0c;发现了以下内容&#xff1a; 2012-03-04T01:52:5100:00 heroku[web.1]: Idling 2012-03-04T01:52:5300:00 heroku[web.1]: Stopping process with SIGTERM 2012-03-04T01:53:0300:00 …

global.min.css,css3-媒体查询样式不覆盖原始样式

我正在尝试对正在建立的网站使用一些媒体查询。 但是&#xff0c;我遇到的问题是&#xff0c;实际上正在应用媒体查询样式时&#xff0c;它们却被覆盖了。 我无法告诉我原因&#xff0c;因为我使用的是相同的选择器。 谁能指出我没看到的东西&#xff1f;原始CSS#global-wrappe…

CSS margin 外边距 属性的位置关系

padding&#xff1a;内边距margin &#xff1a;外边距 margin:10px; 所有 4 个外边距都是 10px ******************************************* margin:10px 5px; 上外边距和下外边距是 10px右外边距和左外边距是 5px ******************************************** margin:10px…

windows无法连接到某个wifi_windows无法连接到无线网络怎么办【解决方法】

无论是win7、win8还是win10系统的电脑&#xff0c;人们在使用它的时候&#xff0c;总会先开机&#xff0c;然后再去连接无线网络。当然&#xff0c;在连接的过程中也可能产生各种各样的问题&#xff0c;例如说无法正常连接到无线网络。常见的原因有密码输入错误&#xff0c;或者…

C语言博客作业--字符数组

一、PTA实验作业 题目1&#xff1a;7-1 字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明。 这个问题我看了好久&#xff0c;试了很多的的错误点&#xff0c;答案和我预料的一样&#xff0c;所以我重新看了一遍…

微信公招访问我服务器的那个端口,查看谁在使用某个网络端口

可以通过"netstat -anp" 来查看哪些端口被打开。(注&#xff1a;加参数-n会将应用程序转为端口显示&#xff0c;即数字格式的地址&#xff0c;如&#xff1a;nfs->2049, ftp->21&#xff0c;因此可以开启两个终端&#xff0c;一一对应一下程序所对应的端口号)若…