Java EE6 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,来自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

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

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

相关文章

c#获取当前目录的一些方法

【内容来源地址】:http://www.cnblogs.com/marcozh/archive/2008/10/19/1314667.html Assembly myAssembly Assembly.GetEntryAssembly(); string path myAssembly.Location; DirectoryInfo dr new DirectoryInfo(path); pathd…

linux里的进程简介

/sbin/init 内核启动的第一个用户级进程,引导用户空间服务 [kthreadd] 内核线程管理[migration/0] 用于进程在不同的CPU间迁移[ksoftirqd/0] 内核调度/管理第0个CPU软中断的守护进程[migration/1] 管理多核心[ksoftirqd/1] 内核调度/管…

python画画bup_Python中的高效Vector / Point类

实现高效的Vector / Point类的最佳方法是什么(甚至更好:是否有一个),可以在Python 2.7和3.x中使用?我找到了the blender-mathutils,但它们似乎只支持Python 3.x.然后是this Vector class,使用numpy,但它只是一个3D矢量.使用具有静态属性(x和y)的像kivy’…

CSDN 编程挑战——《coder的计算器》

coder的计算器 题目详情: coder现在已经上初中,也会用计算器实现 ,-,*,/和幂运算^了,但他觉得市场那些计算器太繁琐了,有很多他不认识的符号,所以他现在很想要能计算带括号的 ,-,*,/和幂运算^的混合表达式就可以了,你…

OpenShift Express:部署Java EE应用程序(支持AS7)

在过去的几年中,我越来越听到有关“云”服务的信息。 最初,我并不是很想尝试一下。 但是几个月后(一年?),我决定看看这是怎么回事。 我从事Java EE开发已经超过7年了,所以我决定看看将Java EE应…

07 总结ProgressDialog 异步任务

1,ProgressDialog> //使用对象 设置标题 progressDialog.setTitle("标题"); //设置图标 progressDialog.setIcon(R.drawable.ic_launcher); //设置展示的内容 progressDialog.setMessage(&q…

python函数封装计算n运算_在Python里面怎么可以运算出999999999**999999999,求思路?...

>>> 999999999 * math.log(999999999, 2) / 8 / 1024 ** 33.480509950621777所以这个数字本身就差不多需要3.5GB内存,考虑到计算过程中需要存储临时结果,还需要翻个两三倍吧而Python中的long可以到多少呢:#define MAX_LONG_DIGITS \…

C++中const关键字的使用总结

const是不变的意思,在C程序中,经常用const来限制对一个对象的操作: 1.1 const变量 例如: const int n3; 则这个变量的值不能改变,即不能对变量赋值。 1.2 const参数 出现在函数参数中的const表示在函数体中不能对这个参数做修改…

php封装redis负载均衡类

$array array( master > array( "redis://127.0.0.1:6379?timeout1", ), slave > array( "redis://127.0.0.1:6479?timeout1", "redis://127.0.0.1:6579?timeout1", ) ); $redis R…

我今天对JavaFX的了解

如果您没有听说过,JavaFX 2是Java的新Desktop / web / client框架。 自JavaFX 1以来,它已经进行了相当大的改动(坦率地说,效果并不那么令人印象深刻)。 自定义脚本语言已经淘汰了,您可以使用标准Java和基于…

怎么解决xp系统不能安装NET Framework4.0?

.net 4.0安装不上解决方法: 引用 9 楼 MoreQuestion 的回复: 全部都不行!就是用360软件管家安装那个就可以了。用了楼主的方法,果然可行啊 1.先安装wic。 2.用360安装.net40 本帖最后由 不懂 于 2014-6-6 00:56 编辑Windows Server 2003 如何…

C++内联(inline)函数

内联函数 内联函数是一种特殊类型的函数,内联函数在定义或声明时前面加上“inline”关键字。比如: inline int max(int a,int b) { return (a>b)?a:b; } 内联(inline)是内联扩展(inline expansion)的简…

我的python学习笔记全集_记录我的Python学习笔记

不想再像以前那样,什么都从头开始学习语法、总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身。所以还是先熟练使用语言去进行开发,等足够熟悉了,…

HDU 5794:A Simple Chess(Lucas + DP)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid5794 题意:让一个棋子从(1,1)走到(n,m),要求像马一样走日字型并只能往右下角走。里面还有r个障碍点不能经过或者到达&am…

php源码分析之PHPAPI宏的作用

在PHP源码中,我们经常会看到很多函数前面有个PHPAPI,但这是什么呢? 于是我在php源码/main/php.h中找到了它的定义 #ifdef PHP_WIN32 # include "tsrm_win32.h" # include "win95nt.h" # ifdef PHP_EXPORTS # …

15分钟内开始使用Amazon Web Services和全自动资源调配

在等待一个新项目时,我想学习一些有用的东西。 而且由于在许多项目中我们需要评估和测试正在开发的应用程序的性能,而很少有足够的硬件来生成实际负载,因此我决定学习更多有关按需在云中按需配置虚拟机的知识,即Amazon Web Servic…

解析JVM内存区域组成

在方法(代码块)中定义一个变量时,java就在栈中为这个变量分配JVM内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的JVM内存空间;而在堆中分配的JVM内存由java虚拟机的自动垃圾回收器来管理。…

python打开浏览器后带cookie_Python爬虫使用浏览器的cookies:browsercookie

很多用Python的人可能都写过网络爬虫,自动化获取网络数据确实是一件令人愉悦的事情,而Python很好的帮助我们达到这种愉悦。然而,爬虫经常要碰到各种登录、验证的阻挠,让人灰心丧气(网站:天天碰到各种各样的爬虫抓我们网…

VS插件开发

参考资料: VS插件开发 - 个性化VS IDE编辑器 自己动手编写一个VS插件(一) VS Addin插件基本开发入门 VS Addin插件配置、部署 转载于:https://www.cnblogs.com/wangwangfei/p/5830081.html

使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍

静态地或在运行时将代码片段注入已编译的类和方法中的功能可能会很有帮助。 这尤其适用于在没有源代码的第三方库中或在无法使用调试器或探查器的环境中对问题进行故障排除。 代码注入对于处理涉及整个应用程序的问题(例如性能监视)也很有用。 以这种方式…