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

java ee cdi_Java EE6 CDI,命名组件和限定符相关推荐

  1. Java EE6 CDI,命名组件和限定符

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

  2. java ee cdi_Java EE CDI限定词:快速浏览

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

  3. java ee cdi_Java EE CDI bean范围

    java ee cdi Java EE平台的上下文和依赖注入(CDI)是一项功能,有助于将Java EE平台的Web层和事务层绑定在一起. CDI是一组服务,可以一起使用,使开发人员可以轻松地在Web ...

  4. java ee cdi_Java EE CDI ConversationScoped示例

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

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

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

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

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

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

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

  8. java ee cdi_Java EE CDI处理程序方法示例

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

  9. java ee cdi_Java EE CDI Producer方法教程

    java ee cdi 这是CDI Producer方法的教程. 在CDI中,生产者方法生成一个对象,然后可以将其注入. 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同 ...

最新文章

  1. php 5.6 mcrypt,php-mcrypt 在PHP5.60+的版本中怎么使用?
  2. confluence中org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed的解决方法
  3. 16s及宏基因组测序公司资源--20161104
  4. JMeter初探二-badboy录制
  5. MATLAB 转PDF图片过大导致两边缺失
  6. MyBatis动态SQL底层原理分析 与 JavaScript中的Date对象,以及UTC、GMT、时区的关系...
  7. 基于9款CSS3鼠标悬停相册预览特效
  8. opencv 鱼眼矫正
  9. Jexl表达式引擎-根据字符串动态执行JAVA
  10. Nginx 在 Linux 下安装与搭建 Tomcat 集群
  11. 边缘检测帧差法matlab,【数字图像处理】帧差法与Kirsch边缘检测实现运动目标识别与分割...
  12. HDU - 6438 优先队列,+贪心。
  13. Flutter 通知栏通知
  14. 为什么微信转账,对方收款要确认,而支付宝却不用?
  15. 物联网、消费物联网、工业物联网与云计算、大数据服务综合分析报告
  16. 如何批量修改多个文件的后缀名!
  17. 创造历史后的2008年中国股市
  18. 2019 蓝桥杯省赛 A 组模拟赛(一)C. 结果填空:马的管辖 (暴力搜索)
  19. 《黑色沙漠》游戏系统拆解
  20. Edge浏览器系列:win10如何关闭Alt+tab只切换Edge浏览器的网页

热门文章

  1. Nginx中如何配置中文域名?
  2. python的三元运算
  3. 2018蓝桥杯省赛---java---B---3(复数幂)
  4. OkHttp上传Json嵌套对象
  5. Linux ss命令 报错,ECS Linux中ss命令显示连接状态的使用说明
  6. 学院派 实践派 计算机科学与技术,饶旻现场为boss所在企业“挑错”
  7. mininet编程实现交换机规则的插入、删除与修改。_可编程网卡芯片在滴滴云网络的应用实践...
  8. jdk9与jdk11哪个好_JDK 9、10和11中的安全性增强
  9. jhipster_jHipster入门,第1部分
  10. eap和psk_针对WildFly和EAP运行Java Mission Control和Flight Recorder