Java EE CDI依赖关系消歧示例

在本教程中,我们将向您展示如何避免CDI bean中的依赖关系消除歧义。 在CDI中,我们可以为应用程序中不同客户端的接口的多个实现实现依赖项注入。 依赖关系消除歧义的问题是客户端如何在不同的实现中调用特定的实现,而不会发生任何错误。

为了了解在将bean注入应用程序时如何避免依赖消除歧义,我们将创建一个简单的服务。 我们将创建服务的两个实现,然后将这两个实现注入到应用程序的servlet中。 我们将使用@Qualifiers ,如下所述。

我们首选的开发环境是Eclipse 。 我们正在使用Eclipse Juno(4.2)版本以及Maven Integration插件版本3.1.0。 您可以从Eclipse的这里从和Maven Eclipse插件这里 。 用于Eclipse的Maven插件的安装不在本教程的讨论范围内,因此将不予讨论。 Tomcat 7是使用的应用程序服务器。

让我们开始,

1.创建一个新的Maven项目

转到文件->项目-> Maven-> Maven项目。

新人项目

在向导的“选择项目名称和位置”页面中,确保未选中 “创建简单项目(跳过原型选择)”选项,单击“下一步”以继续使用默认值。

新项目

在这里,必须添加用于创建Web应用程序的Maven原型。 单击“添加原型”并添加原型。 将“ Archetype组ID”变量设置为"org.apache.maven.archetypes" ,将“ Archetype构件ID”变量设置为"maven-archetype-webapp" ,将“ Archetype版本”设置为"1.0" 。 点击“确定”继续。

Maven的原型Web应用程序

在向导的“输入工件ID”页面中,您可以定义项目的名称和主程序包。 将“ Group Id”变量设置为"com.javacodegeeks.snippets.enterprise" ,将“ Artifact Id”变量设置为"cdibeans" 。 上述选择组成主体工程包作为"com.javacodegeeks.snippets.enterprise.cdibeans"和项目名称为"cdibeans" 。 将“ Package”变量设置为"war" ,以便创建一个war文件以部署到tomcat服务器。 点击“完成”退出向导并创建您的项目。

newcdiproject1

Maven项目结构如下所示:

newcdiproject2

  • 它包含以下文件夹:
  • / src / main / java文件夹,其中包含应用程序动态内容的源文件,
  • / src / test / java文件夹包含用于单元测试的所有源文件,
  • / src / main / resources文件夹包含配置文件,
  • / target文件夹包含已编译和打包的可交付成果,
  • / src / main / resources / webapp / WEB-INF文件夹包含Web应用程序的部署描述符,
  • pom.xml是项目对象模型(POM)文件。 包含所有项目相关配置的单个文件。

2.添加所有必要的依赖项

您可以通过在POM编辑器的“ Pom.xml”页面上对其进行编辑,来在Maven的pom.xml文件中添加依赖项,如下所示:
pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.javacodegeeks.snippets.enterprise.cdi</groupId><artifactId>cdibeans</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>cdibeans Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>org.jboss.weld.servlet</groupId><artifactId>weld-servlet</artifactId><version>1.1.10.Final</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.faces</artifactId><version>2.1.7</version></dependency></dependencies><build><finalName>cdibeans</finalName></build>
</project>

如您所见,Maven以声明方式管理库依赖关系。 创建本地存储库(默认情况下,位于{user_home} /。m2文件夹下),所有必需的库都从公共存储库下载并放置在该库中。 此外,库内的依赖关系会自动解决和处理。

3.创建一个简单的服务

我们利用一个简单的服务为使用它的应用程序创建问候消息。 GreetingCard.java类是带有产生问候消息的方法的接口。

GreetingCard.java

package com.javacodegeeks.snippets.enterprise.cdibeans;public interface GreetingCard {void sayHello();
}

我们创建该服务的两个实现。 每个实现都会产生不同的消息,如下所示:

GreetingCardImpl.java

package com.javacodegeeks.snippets.enterprise.cdibeans.impl;import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingCard;public class GreetingCardImpl implements GreetingCard {public void sayHello() {System.out.println("Hello!!!");}}

AnotherGreetingCardImpl.java

package com.javacodegeeks.snippets.enterprise.cdibeans.impl;import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingCard;public class AnotherGreetingCardImpl implements GreetingCard {public void sayHello() {System.out.println("Have a nice day!!!");}}

4.服务的使用

为了将服务注入另一个bean,我们可以使用@Qualifier 。 CDI允许我们创建自己的Java批注,然后在应用程序的注入点中使用它,以根据Bean的GreetingType获得正确的GreetingCard实现。

Greetings.java

package com.javacodegeeks.snippets.enterprise.cdibeans;import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import javax.inject.Qualifier;@Qualifier
@Retention(RUNTIME)
@Target({ FIELD, TYPE, METHOD })
public @interface Greetings {GreetingType value();}

GreetingType.java是一个枚举,如下所示:

GreetingType.java

package com.javacodegeeks.snippets.enterprise.cdibeans;public enum GreetingType {HELLO, HI;
}

现在,服务实现使用注释,如下所示:

GreetingCardImpl.java

package com.javacodegeeks.snippets.enterprise.cdibeans.impl;import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingCard;@Greetings(GreetingType.HELLO)
public class GreetingCardImpl implements GreetingCard {public void sayHello() {System.out.println("Hello!!!");}}

AnotherGreetingCardImpl.java

package com.javacodegeeks.snippets.enterprise.cdibeans.impl;import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingCard;@Greetings(GreetingType.HI)
public class AnotherGreetingCardImpl implements GreetingCard {public void sayHello() {System.out.println("Have a nice day!!!");}}

5.将服务注入到servlet中

我们创建一个简单的servlet,并使用CDI提供的@Inject注释注入服务的两种实现,如下所示:

GreetingServlet.java

package com.javacodegeeks.snippets.enterprise.cdibeans.servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingCard;
import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingType;
import com.javacodegeeks.snippets.enterprise.cdibeans.Greetings;@WebServlet(name = "greetingServlet", urlPatterns = {"/sayHello"})
public class GreetingServlet extends HttpServlet {private static final long serialVersionUID = 2280890757609124481L;@Inject@Greetings(GreetingType.HELLO)private GreetingCard greetingCard;@Inject@Greetings(GreetingType.HI)private GreetingCard anotherGreetingCard;public void init() throws ServletException {}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<h1>" + greetingCard.sayHello() + "</h1>");out.println("<h1>" + anotherGreetingCard.sayHello() + "</h1>");}public void destroy(){}}

要运行该示例,我们必须使用Maven构建项目,然后将生成的war文件放置在tomcat的webbaps文件夹中。 然后,我们可以继续:

http://localhost/8080/cdibeans/sayHello

结果是如下所示:

产品

请注意,如Java EE CDI Producer方法教程中所示,使用Producer方法注入CDI bean时,依赖关系也可能会消除歧义。
这是Java EE CDI依赖关系歧义教程。 下载本教程的源代码: CDIDependencyDisambiguationExample.zip

翻译自: https://www.javacodegeeks.com/2013/06/java-ee-cdi-dependency-disambiguation-example.html

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

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

相关文章

linux java 安装配置_类Linux环境安装jdk1.8及环境变量配置详解

配置很简单&#xff0c;但是每次都要查一下&#xff0c;索性就记录下1. 安装前准备1.1 创建安装目录&#xff0c;习惯上通常安装在/usr/local/jdk8目录下mkdir /usr/local/jdk81.2 查看是否安装过jdk&#xff0c;安装前要把之前的删除干净# 通过jdk环境变量查看echo $JAVA_HOME…

Mac版Anaconda安装R语言iGraph包

Anaconda官网给出的R语言Igraph包安装方法&#xff1a;https://anaconda.org/r/r-igraph 查阅Anaconda官方文档&#xff0c;可以通过以下控制台命令安装R语言Igraph包。 conda install -c r r-igraph 在控制台执行后&#xff0c;系统可能会提示未找到conda指令&#xff0c; 所以…

Html5中Canvas(画布)的使用

什么是 Canvas&#xff1f;HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域&#xff0c;您可以控制其每一像素。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。创建 Canvas 元素向 HTML5 页面添加 canvas 元素。规定元素的 id、宽…

多个动态包含一个JSF标签

每个JSF开发人员都知道ui&#xff1a;include和ui&#xff1a;param标签。 您可以包括一个facelet&#xff08;XHTML文件&#xff09;并传递一个对象&#xff0c;该对象将在包含的facelet中可用&#xff0c;如下所示&#xff1a; <ui:include src"/sections/columns.x…

[JLOI2014]松鼠的新家

嘟嘟嘟 这还是一道树链剖分板子题呀&#xff01; 从1到n - 1枚举a[i]&#xff0c;每一次使节点a[i]到a[i 1]的路径加1&#xff0c;但这样的话除a[1]&#xff0c;每一个点都多加了一个1&#xff0c;所以输出答案的时候减1即可。 1 #include<cstdio>2 #include<iostrea…

CSS3-背景(background-image、background-size、background-origin、background-clip)

CSS3中新的背景属性&#xff1a;background-image、background-size、background-origin、background-clip 背景图片&#xff1a;background-image CSS3中可以通过background-image属性添加背景图片。 不同的背景图像和图像用逗号隔开&#xff0c;所有的图片中显示在最顶端的为…

使用String.intern()减少内存使用

时不时地会有一个垂死的生产应用程序。 而且您知道您需要尽快对其进行修补。 我们也一样&#xff0c;并认为分享最近的一个战争故事将很有趣。 在这种情况下&#xff0c;我们就有机会使用String.intern&#xff08;&#xff09;之类的简单补丁来修补应用程序。 但是&#xff0c…

CSS实现比翼双飞和圣杯布局模型效果

圣杯模型和比翼双飞模型主要的特指1.首先加载的是中间部分&#xff0c;其次是左边&#xff0c;然后是右边 2.中间是自适应&#xff0c;二边是定宽 实现方法1.grid2.margin float position:releative父亲加padding 挤进去3.margin float box-size:border-box 1.gridhtml:&l…

jmeter创建高级测试计划

如果应用程序使用重写地址而不是使用cookie存储信息&#xff0c;需要做一些额外的工作去测试程序 为了正确的响应重写地址&#xff0c;jmeter 需要解析 从服务器获取html 并且检索会话ID, 1 合理利用pre-processors-http url rewriting modifier 来完成&#xff0c;简单的输入s…

单元测试技巧:创建描述性测试

您的单元测试应尽可能具有描述性。 他们给您的反馈应该非常清楚&#xff0c;您甚至不需要启动调试器并一步一步地检查代码来检查局部变量。 为什么&#xff1f; 因为那需要时间&#xff0c;而且我们很懒&#xff0c;对吗&#xff1f; 为此&#xff0c;您需要创建描述性测试。 有…

vue.js--基础事件定义,获取数据,执行方法传值

<template><div id"app"> <h1>{{ msg }}</h1> <br> <button v-on:click"run1()"> 第一种写法</button> <br> <button clickrun2()> 第二种写法</button> <br> <button clickgetMsg(…

Spring集成–强大的拆分器聚合器

坚固是什么意思&#xff1f; 在本文的上下文中&#xff0c;健壮性是指在不立即返回到调用者的情况下管理流中的异常条件的能力。 在某些处理方案中&#xff0c; n个 m个回答足以做出结论。 通常具有这些趋势的示例处理场景是&#xff1a; 财务&#xff0c;保险和预订系统的…

填充一个池需要多少个线程?

近几个月来&#xff0c;我们一直看到一小部分但持续的操作失败&#xff0c;并带有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接&#xff1b; 嵌套异常是java.sql.SQLException&#xff1a;客户端尝试检出Connection的尝试…

@font-face 用字体画图标

HTML 1 <body>2 <!-- ul.layout>li*5>a[href#]>i.icon -->3 <!-- Sublime Text 快捷拼写 -->4 <ul class"layout">5 <li><a href"#"><i class"icon">&#xe601;</…

java mapfile_基于文件的数据结构:关于MapFile

MapFile是已经排过序的SequenceFile&#xff0c;它有索引&#xff0c;所以可以按键查找1.MapFile的写操作MapFile的写操作类似于SequenceFile的写操作。新建一个MapFile.Writer实例&#xff0c;然后调用append()方法顺序写入文件内容。如果不按顺序写入&#xff0c;就抛出一个I…

java 循环依赖_解决Java循环依赖的问题

最近看到一个问题&#xff1a;如果有两个类A和B&#xff0c;A类中有一个B的对象b&#xff0c;B类中有一个A的对象a&#xff0c;那么如何解决这两个类的相互依赖关系呢&#xff0c;几天就给大家说一下Java的循环依赖&#xff0c;raksmart服务器。举个栗子1&#xff1a;可以看到A…

Intellij IDEA 将工程转换成maven工程 详解

1> 右键工程&#xff0c;点击 Add Framework Support2> 选中 Maven&#xff0c;再点击 OK3> 工程根目录自动生成 pom.xml 文件&#xff0c;这样 工程就支持 Maven版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 http://blog.csdn.net/che…

数据结构(七)排序---直接插入排序(稳定)

经典排序算法----直接插入排序算法及其改进&#xff08;稳定&#xff09; 定义&#xff1a; 直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的&#xff0c;记录数加一的有序表。 实现思想 我们预留了一个哨兵&#xff0c;这里我们将…

java嵌套类型 无法隐藏外层类型_java内部类深入详解 内部类的分类 特点 定义方式 使用...

java内部类 内部类的分类 特点 定义方式 使用 外部类调用内部类 多层嵌套内部类 内部类访问外部类属性 接口中的内部类 内部类的继承 内部类的覆盖 局部内部类 成员内部类 静态内部类 匿名内部类内部类定义将一个类定义放到另一个类的内部,这就是内部类内部类与组合是完…

java.io.FileNotFoundException: generatorConfig.xml (系统找不到指定的文件。)

在使用MyBatis的逆向工程生成代码时&#xff0c;一直报错java.io.FileNotFoundException: generatorConfig.xml (系统找不到指定的文件。)&#xff0c;如图 文件结构如下&#xff1a; 代码如下&#xff1a; import java.io.File; import java.util.ArrayList; import java.util…