java ee cdi_Java EE6 CDI,命名组件和限定符

java ee cdi

Java EE6的最大承诺之一就是简化了依赖注入的使用。 他们做到了,使用CDI 。 CDI代表Java EE的上下文和依赖注入,它提供了一个基础集,用于在企业应用程序中应用依赖注入。

在CDI之前,EJB 3还引入了依赖注入,但这有点基础。 您可以将EJB(全状态或无状态)注入另一个EJB或Servlet(如果您的容器支持)。 当然,并不是每个应用程序都需要EJB的,这就是CDI如此受欢迎的原因。

首先,我举了这个例子。 有一个Payment接口和2个实现。 现金付款和签证付款。

我希望仍然可以使用相同的界面选择我注入的女巫付款类型:

public interface Payment {void pay(BigDecimal amount);
}

这是两个实现:

public class CashPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(CashPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} cash", amount.toString());}
}
public class VisaPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(VisaPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} with visa", amount.toString());}
}

要注入接口,我们使用@Inject批注。 注释基本上按照它说的去做。 它注入一个组件,该组件在您的应用程序中可用。

@Inject private Payment payment;

当然,您看到的消息来自一英里远,这是行不通的。 该容器具有我们的Payment接口的2个实现,因此他不知道要注入哪个。

类型[Payment]类型的依赖关系,在注入点[[field] @Inject private be.styledideas.blog.qualifier.web.PaymentBackingAction.payment]处带有限定符[@Default]

因此,我们需要某种限定符来指出所需的实现。 CDI提供@Named批注,使您可以为实现命名。

@Named("cash")
public class CashPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(CashPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} cash", amount.toString());}
}
@Named("visa")
public class VisaPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(VisaPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} with visa", amount.toString());}
}

现在,当我们更改注入代码时,我们可以指定所需的实现。

@Inject private @Named("visa") Payment payment;

这行得通,但是灵活性受到限制。 当我们想重命名@Named参数时,我们必须在使用它的每个地方都对其进行更改。 也没有重构支持。

使用@Qualifier批注使用定制注解有更好的选择。 让我们稍微更改一下代码。

首先,我们创建新的注释类型。

@java.lang.annotation.Documented
@java.lang.annotation.Retention(RetentionPolicy.RUNTIME)
@javax.inject.Qualifier
public @interface CashPayment {
}
@java.lang.annotation.Documented
@java.lang.annotation.Retention(RetentionPolicy.RUNTIME)
@javax.inject.Qualifier
public @interface VisaPayment {
}

添加到注释中的@Qualifier注释使容器可以发现此注释。 现在,我们可以简单地将这些注释添加到我们的实现中。

@CashPayment
public class CashPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(CashPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} cash", amount.toString());}
}
@VisaPayment
public class VisaPaymentImpl implements Payment {private static final Logger LOGGER = Logger.getLogger(VisaPaymentImpl.class.toString());@Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, "payed {0} with visa", amount.toString());}
}

现在我们唯一要做的就是将我们的注入代码更改为

@Inject private @VisaPayment Payment payment;

现在,当我们对限定符进行更改时,我们将获得不错的编译器和重构支持。 这也为API或特定于域的语言设计增加了灵活性。

参考: Java EE6 CDI,来自我们JCG合作伙伴 Jelle Victoor的 命名组件和限定词,来自Styled Ideas Blog 。

相关文章 :
  • Java EE6装饰器:在注入时装饰类
  • Java EE6事件:JMS的轻量级替代品
  • Java EE中的配置管理
  • 基本的EJB参考,注入和查找
  • Java模块化方法–模块,模块,模块
  • Java EE过去,现在和云7
  • Java教程和Android教程列表

翻译自: https://www.javacodegeeks.com/2011/10/java-ee6-cdi-named-components-and.html

java ee cdi

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

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

相关文章

如何使用git下载别人在github的代码?

今天东哥让我帮他们公司检查一下几十款产品的前端代码,我用新电脑作业了一下,简单分享git如何下载别人的代码。 完整教程请参考我上篇文章:——> Git教程学习总结 首先本地有git环境。打开git bash here。 查看一下版本 初始化git使…

AppScan的安装与使用

AppScan的安装与使用 实验环境:Win7 Win2k8 将软件包复制到这个目录下: 双击 复制到C盘: 复制到C盘的这个目录下,并替换: 然后到菜单栏中,双击查看: 这样就可以使用了: 使用App…

CocoaPods 安装和使用

一、《什么是CocoaPods》 官网描述:CocoaPods is the dependency manager for Swift and Objective-C Cocoa projects. It has almost ten thousand libraries and can help you scale your projects elegantly.(CocoaPods是一个独立的管理器,可以为Swif…

cmd黑窗口命令行模式进入指定盘符下的任意文件夹

通过使用命令,并加入参数 /d ,可以通过一个步骤,直接进入指定盘符下的任意文件夹 比如要进入C盘下的C:\Users\Pactera\Desktop\rtt_web目录,则输入cd /d C:\Users\Pactera\Desktop\rtt_web

接口测试工具 restlet client

参考: https://blog.csdn.net/sunrainamazing/article/details/81281382https://blog.csdn.net/zlp1992/article/details/76706017 文章目录 下载若 你能翻墙下载 可以去如下网址下载方式二 采用离线CRX的方式进行安装(我用的第二种方式) 安装其次 , 一…

attr()与setAttribute()的区别

先看红色标注的: 这里传过来的this是个元素节点,因此currentTr也得用获取节点的方式parentNode去获取,而不能写parent(),这是第一个需要注意的地方。 第二个问题,就是怎么给currentTr设置属性和值得问题。我一开始想当…

我是如何成功准备VUE项目之前的开发环境?

提前安装好node, 参考我上一篇文章--------> 不同node.js版本 1.从git上把代码拷贝下来。 git clone +项目地址。 2.cmd模式下安装npm。 npm install 3.启动服务,npm run serve 。这里需要注意的是serve千万不要打成server啦,不然容易报错,这里还有两个小技…

moxy json介绍_通过MOXy实现使您的JAXB更清洁

moxy json介绍编组和解组XML时使用JAXB的主要优点是编程模型。 只需注释几个POJO并使用JAXB API,您就可以很容易地序列化为XML和从XML反序列化。 您无需担心有关XML如何编组/解组的细节。 一切都比DOM和SAX等替代方案简单得多。 现在,XML文件中的数据本质…

Tomcat样列目录session 操控漏洞

一、基本情况 漏洞级别:中危 漏洞类别:session操纵漏洞 二、问题描述 ApacheTomcat默认安装页面中存在examples样例目录。里面存放着Servlets、JSP、WebSocket的一些服务脚本和接口等样例。Servletsexamples服务样例下存在一个session的样例。该样例可…

Failed to compile. ./src/utils/request.js Module not found: Error: Can‘t resolve ‘util-merge‘ in ‘C

在webstorm运行vue的一个项目,访问主页报错: Failed to compile. ./src/utils/request.js Module not found: Error: Cant resolve util-merge in C:\Users\Pactera\Desktop\rtt_web\src\utils 检查了一下代码是缺少util-merge插件。可以在编译器上进…

发布:NetBeans IDE 8.1 Beta

NetBeans IDE 8.1 Beta已发布。 NetBeans IDE在为Java开发人员提供完整而全面的工具方面拥有超过15年的丰富经验。 在过去的几年中,NetBeans IDE已为JavaScript开发人员实现了同样的目标。 特别是,NetBeans IDE 8.1引入了用于Node.js应用程序开发的完整而…

域名DNS解析工具ping/nslookup/dig/host

常见 DNS 记录的类型 类型目的A地址记录,用来指定域名的 IPv4 地址,如果需要将域名指向一个 IP 地址,就需要添加 A 记录。AAAA用来指定主机名(或域名)对应的 IPv6 地址记录。CNAME如果需要将域名指向另一个域名,再由另一个域名提供…

RegularExpressionValidator 常用

RegularExpressionValidator 控件用于验证输入值是否匹配正则表达式指定的模式 属性: ControlToValidate"要验证的控件名称" ValidationExpression"验证规则" ErrorMessage"所要显示的错误信息" text“当验证失败时显示的消息。” Fo…

Gitlab添加SSH密钥的解决办法

打开git bash here, 注意期间“输入密码(空没有密码):再次输入密码]:[键入密码]#再次输入相同的密码”,如下: “Enter passphrase (empty for no passphrase): [Type a passphrase] # Enter sa…

TLS/SSl相关的攻击漏洞及检测方法大杂烩!

TLS/SSl相关的攻击漏洞及检测方法大杂烩! 曾以为爱可以排除万难,可万难过后,又有万难。 漏洞介绍: TLS/SSL介绍: SSL“安全套接层”协议,TLS“安全传输层”协议,都属于是加密协议,在其网络数据传输中起到…

gitlab或者gitee生成/添加SSH公钥的解决办法

打开Git Bash Here, gitlab或者Gitee 提供了基于SSH协议的Git服务,在使用SSH协议访问仓库仓库之前,需要先配置好账户/仓库的SSH公钥。 你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # Generating public/private rsa key pair... …

数据结构与算法——选择排序

//选择排序#include<stdio.h>void SelectSort(int arr[],int len);int main(void){ int i; int arr[9]{1,4,2,4,6,8,3,9,5}; int lensizeof(arr)/sizeof(arr[0]); SelectSort(arr,len); for(i0;i<len;i) { printf("%d ",arr[i]); }}void SelectSort(int arr…

点击劫持漏洞

1、漏洞理解 点击劫持&#xff08;Click Jacking&#xff09;是一种视觉上的欺骗手段&#xff0c;攻击者通过使用一个透明的iframe&#xff0c;覆盖在一个网页上&#xff0c;然后诱使用户在该页面上进行操作&#xff0c;通过调整iframe页面的位置&#xff0c;可以使得伪造的页面…

在 Gitee 上使用 GPG公钥(Beta版)

Windows 下载 https://gpg4win.org/ 生成 GPG Key 选择免费版的下载&#xff0c;无脑安装即可。 安装成功打开文件。 新建文件&#xff0c;创建个人密钥对&#xff0c;点击确认 输入码云的用户名及邮箱&#xff0c;一定要对应 输入完成可能需要输入或者创建密码&#xff0c;使…

javafx 值对_我今天对JavaFX的了解

javafx 值对如果您还没有听说过&#xff0c;JavaFX 2是Java的新Desktop / web / client框架。 自JavaFX 1以来&#xff0c;它已经进行了相当大的改动&#xff08;坦率地说&#xff0c;效果不那么令人印象深刻&#xff09;。 自定义脚本语言已经淘汰了&#xff0c;您可以使用标准…