Java EE CDI依赖关系消歧示例
在本教程中,我們將向您展示如何避免CDI bean中的依賴關(guān)系消除歧義。 在CDI中,我們可以為應(yīng)用程序中不同客戶端的接口的多個(gè)實(shí)現(xiàn)實(shí)現(xiàn)依賴項(xiàng)注入。 依賴關(guān)系消除歧義的問(wèn)題是客戶端如何在不同的實(shí)現(xiàn)中調(diào)用特定的實(shí)現(xiàn),而不會(huì)發(fā)生任何錯(cuò)誤。
為了了解在將bean注入應(yīng)用程序時(shí)如何避免依賴消除歧義,我們將創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)。 我們將創(chuàng)建服務(wù)的兩個(gè)實(shí)現(xiàn),然后將這兩個(gè)實(shí)現(xiàn)注入到應(yīng)用程序的servlet中。 我們將使用@Qualifiers ,如下所述。
我們首選的開發(fā)環(huán)境是Eclipse 。 我們正在使用Eclipse Juno(4.2)版本以及Maven Integration插件版本3.1.0。 您可以從Eclipse的這里從和Maven Eclipse插件這里 。 用于Eclipse的Maven插件的安裝不在本教程的討論范圍內(nèi),因此將不予討論。 Tomcat 7是使用的應(yīng)用程序服務(wù)器。
讓我們開始,
1.創(chuàng)建一個(gè)新的Maven項(xiàng)目
轉(zhuǎn)到文件->項(xiàng)目-> Maven-> Maven項(xiàng)目。
在向?qū)У摹斑x擇項(xiàng)目名稱和位置”頁(yè)面中,確保未選中 “創(chuàng)建簡(jiǎn)單項(xiàng)目(跳過(guò)原型選擇)”選項(xiàng),單擊“下一步”以繼續(xù)使用默認(rèn)值。
在這里,必須添加用于創(chuàng)建Web應(yīng)用程序的Maven原型。 單擊“添加原型”并添加原型。 將“ Archetype組ID”變量設(shè)置為"org.apache.maven.archetypes" ,將“ Archetype構(gòu)件ID”變量設(shè)置為"maven-archetype-webapp" ,將“ Archetype版本”設(shè)置為"1.0" 。 點(diǎn)擊“確定”繼續(xù)。
在向?qū)У摹拜斎牍ぜ蘒D”頁(yè)面中,您可以定義項(xiàng)目的名稱和主程序包。 將“ Group Id”變量設(shè)置為"com.javacodegeeks.snippets.enterprise" ,將“ Artifact Id”變量設(shè)置為"cdibeans" 。 上述選擇組成主體工程包作為"com.javacodegeeks.snippets.enterprise.cdibeans"和項(xiàng)目名稱為"cdibeans" 。 將“ Package”變量設(shè)置為"war" ,以便創(chuàng)建一個(gè)war文件以部署到tomcat服務(wù)器。 點(diǎn)擊“完成”退出向?qū)Р?chuàng)建您的項(xiàng)目。
Maven項(xiàng)目結(jié)構(gòu)如下所示:
- 它包含以下文件夾:
- / src / main / java文件夾,其中包含應(yīng)用程序動(dòng)態(tài)內(nèi)容的源文件,
- / src / test / java文件夾包含用于單元測(cè)試的所有源文件,
- / src / main / resources文件夾包含配置文件,
- / target文件夾包含已編譯和打包的可交付成果,
- / src / main / resources / webapp / WEB-INF文件夾包含Web應(yīng)用程序的部署描述符,
- pom.xml是項(xiàng)目對(duì)象模型(POM)文件。 包含所有項(xiàng)目相關(guān)配置的單個(gè)文件。
2.添加所有必要的依賴項(xiàng)
您可以通過(guò)在POM編輯器的“ Pom.xml”頁(yè)面上對(duì)其進(jìn)行編輯,來(lái)在Maven的pom.xml文件中添加依賴項(xiàng),如下所示:
pom.xml:
如您所見,Maven以聲明方式管理庫(kù)依賴關(guān)系。 創(chuàng)建本地存儲(chǔ)庫(kù)(默認(rèn)情況下,位于{user_home} /。m2文件夾下),所有必需的庫(kù)都從公共存儲(chǔ)庫(kù)下載并放置在該庫(kù)中。 此外,庫(kù)內(nèi)的依賴關(guān)系會(huì)自動(dòng)解決和處理。
3.創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)
我們利用一個(gè)簡(jiǎn)單的服務(wù)為使用它的應(yīng)用程序創(chuàng)建問(wèn)候消息。 GreetingCard.java類是帶有產(chǎn)生問(wèn)候消息的方法的接口。
GreetingCard.java
package com.javacodegeeks.snippets.enterprise.cdibeans;public interface GreetingCard {void sayHello(); }我們創(chuàng)建該服務(wù)的兩個(gè)實(shí)現(xiàn)。 每個(gè)實(shí)現(xiàn)都會(huì)產(chǎn)生不同的消息,如下所示:
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.服務(wù)的使用
為了將服務(wù)注入另一個(gè)bean,我們可以使用@Qualifier 。 CDI允許我們創(chuàng)建自己的Java批注,然后在應(yīng)用程序的注入點(diǎn)中使用它,以根據(jù)Bean的GreetingType獲得正確的GreetingCard實(shí)現(xiàn)。
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是一個(gè)枚舉,如下所示:
GreetingType.java
package com.javacodegeeks.snippets.enterprise.cdibeans;public enum GreetingType {HELLO, HI; }現(xiàn)在,服務(wù)實(shí)現(xiàn)使用注釋,如下所示:
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.將服務(wù)注入到servlet中
我們創(chuàng)建一個(gè)簡(jiǎn)單的servlet,并使用CDI提供的@Inject注釋注入服務(wù)的兩種實(shí)現(xiàn),如下所示:
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(){}}要運(yùn)行該示例,我們必須使用Maven構(gòu)建項(xiàng)目,然后將生成的war文件放置在tomcat的webbaps文件夾中。 然后,我們可以繼續(xù):
http://localhost/8080/cdibeans/sayHello
結(jié)果是如下所示:
請(qǐng)注意,如Java EE CDI Producer方法教程中所示,使用Producer方法注入CDI bean時(shí),依賴關(guān)系也可能會(huì)消除歧義。
這是Java EE CDI依賴關(guān)系歧義教程。 下載本教程的源代碼: CDIDependencyDisambiguationExample.zip
翻譯自: https://www.javacodegeeks.com/2013/06/java-ee-cdi-dependency-disambiguation-example.html
總結(jié)
以上是生活随笔為你收集整理的Java EE CDI依赖关系消歧示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑940MX什么意思(电脑显卡940M
- 下一篇: 使用Java和Google GSON解析