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,来自Styled Ideas Blog的 JCG合作伙伴 Jelle Victoor的 命名组件和限定词 。

相关文章 :
  • 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 EE6 CDI,命名组件和限定符相关推荐

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

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

  2. openshift_红帽Openshift:入门–云中的Java EE6

    openshift 现在有一段时间,我正在研究"云". 研究它的功能,它可以做什么,为什么我们应该切换到"云",进行交谈,与Realmaolmen的云专家@ma ...

  3. 红帽Openshift:入门–云中的Java EE6

    现在有一段时间,我正在研究"云". 研究它的功能,它可以做什么,为什么我们应该切换到"云",进行讨论,与RealDolmen的云专家@maartenballia ...

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

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

  5. 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例

    原文: 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例 [源码下载] 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例 作者: ...

  6. java限定符_正则表达式之限定符

    导读热词 我们知道正则表达式中的元字符一次一般只能匹配一个位置或一个字符,如果要匹配一个或 零个或多个字符的时候,则需要使用限定符了.限定符就是允许特定字符或字符集合自身重复出 现的次数.常用的限定符 ...

  7. Java基础之访问权限(访问限定符)

    1 定义 2 使用方式 3 出现的位置 4 总结 1 定义 访问权限是指定义在类中的方法和属性是否可以在其它类使用. public protected 不写 private 公开的,所有类都能使用 受 ...

  8. java限定符_Java-泛型限定符、通配符

    关键字:泛型.限定符.通配符 https://www.jianshu.com/p/897fba7bfe7b 这篇文章讲了什么是泛型.为什么会有泛型.泛型使用的注意事项. 下面讲点别的内容. 限定符 限 ...

  9. Java EE6装饰器:在注入时装饰类

    软件中常见的设计模式是装饰器模式 . 我们上一堂课,然后在它周围包装另一堂课. 这样,当我们调用类时,我们总是在到达内部类之前经过周围的类. Java EE 6允许我们通过CDI创建装饰器,作为其AO ...

最新文章

  1. 【转】摄像头编程实例
  2. rocketmq(三 java操作rocket API, rocketmq 幂等性)
  3. java openssl库,Java的OpenSSL
  4. redis缓存穿透、缓存雪崩、缓存击穿、并发竞争
  5. 004-JQuery属性
  6. 项目管理思考——我适合做项目经理吗
  7. html层次选择器例题,详解强大的jQuery选择器之基本选择器、层次选择器
  8. JBoss4.2.3GA 配置 Quartz
  9. NavigatorContent使用皮肤
  10. Python Tricks(八)—— 斐波那契数列的另类实现
  11. Java速成:Boot入门
  12. lvm 多个硬盘合成一个_linux使用LVM合并硬盘
  13. 二维码图片生成(带文字显示)
  14. 宽带连接错误的处理办法
  15. 以太坊源码分析(53)以太坊测试网络Clique_PoA介绍
  16. w10不能访问网络计算机,win10系统无法访问局域网电脑的具体教程
  17. 【C语言刷题】文件操作章节配套练习(选择题 + 编程题)
  18. Servlet入门到精通-任亮-专题视频课程
  19. 移动APP对我们的生活影响?
  20. 手机邮箱怎么弄_怎么在手机上使用outlook邮箱_outlook手机邮箱设置方法-系统城...

热门文章

  1. posman mocks_使用Mocks进行需求驱动的软件开发
  2. java登录界面命令_Java命令行界面(第12部分):CLAJR
  3. javafx树视图加选框_JavaFX缺少的功能调查:表视图
  4. java 调用祖父方法_在Java中调用祖父母方法:您不能
  5. jsf表单验证_JSF:在正确的阶段进行验证(了解生命周期)
  6. drools6.5_Drools 6.2.0.Final发布
  7. Spring Boot Actuator:在其顶部具有MVC层的自定义端点
  8. 参数化测试 junit_JUnit中的参数化测试运行器
  9. choiceformat_ChoiceFormat:数字范围格式
  10. 操作方法:具有多个Mongo存储库和Kotlin的Spring Boot 2 Web应用程序