日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java EE CDI程序化依赖关系消歧示例–注入点检查

發(fā)布時間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java EE CDI程序化依赖关系消歧示例–注入点检查 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在本教程中,我們將看到在注入Java EE CDI bean時如何避免程序依賴消除歧義。 我們已經(jīng)在Jave EE依賴關(guān)系消除歧義示例中展示了如何避免CDI Bean中的依賴關(guān)系歧義消除。 在這里,我們將向您展示如何以動態(tài)方式避免依賴消除歧義。 我們將通過檢查注入另一個bean的實現(xiàn)的bean的注入點來實現(xiàn)這一點。

通過創(chuàng)建具有兩種實現(xiàn)方式的簡單服務(wù),將檢查注入點檢查的程序歧義消除。 然后,我們將創(chuàng)建一個Producer方法來生成和注入應(yīng)用程序中的兩個實現(xiàn)。

我們首選的開發(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)建一個新的Maven項目

轉(zhuǎn)到文件->項目-> Maven-> Maven項目。

在向?qū)У摹斑x擇項目名稱和位置”頁面中,確保未選中 “創(chuàng)建簡單項目(跳過原型選擇)”選項,單擊“下一步”以繼續(xù)使用默認值。

在這里,必須添加用于創(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" 。 點擊“確定”繼續(xù)。

在向?qū)У摹拜斎牍ぜ蘒D”頁面中,您可以定義項目的名稱和主程序包。 將“ Group Id”變量設(shè)置為"com.javacodegeeks.snippets.enterprise" ,將“ Artifact Id”變量設(shè)置為"cdibeans" 。 上述選擇組成主體工程包作為"com.javacodegeeks.snippets.enterprise.cdibeans"和項目名稱為"cdibeans" 。 將“ Package”變量設(shè)置為"war" ,以便創(chuàng)建一個war文件以部署到tomcat服務(wù)器。 點擊“完成”退出向?qū)Р?chuàng)建您的項目。

Maven項目結(jié)構(gòu)如下所示:

  • 它包含以下文件夾:
  • / src / main / java文件夾,其中包含應(yīng)用程序動態(tài)內(nèi)容的源文件,
  • / src / test / java文件夾包含用于單元測試的所有源文件,
  • / src / main / resources文件夾包含配置文件,
  • / target文件夾包含已編譯和打包的可交付成果,
  • / src / main / resources / webapp / WEB-INF文件夾包含Web應(yīng)用程序的部署描述符,
  • pom.xml是項目對象模型(POM)文件。 包含所有項目相關(guān)配置的單個文件。

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以聲明方式管理庫依賴關(guān)系。 創(chuàng)建本地存儲庫(默認情況下,位于{user_home} /。m2文件夾下),所有必需的庫都從公共存儲庫下載并放置在該庫中。 此外,庫內(nèi)的依賴關(guān)系會自動解決和處理。

3.創(chuàng)建一個簡單的服務(wù)

GreetingCard.java一個簡單的服務(wù),可以為使用它的應(yīng)用程序創(chuàng)建問候消息。 它是帶有產(chǎn)生問候消息的方法的接口。

GreetingCard.java

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

該服務(wù)的實現(xià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.創(chuàng)建一個Producer方法來注入bean

為了將服務(wù)注入另一個bean,我們創(chuàng)建了自己的注釋。 CDI允許我們創(chuàng)建自己的Java批注,即GreetingType.java ,然后在應(yīng)用程序的注入點中使用它,以根據(jù)bean的GreetingType獲得正確的GreetingCard實現(xiàn)。

Greetings是使用服務(wù)的實現(xiàn)參數(shù)化的枚舉,如下所示:

GreetingType.java

package com.javacodegeeks.snippets.enterprise.cdibeans;import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME;import java.lang.annotation.Retention; import java.lang.annotation.Target;import com.javacodegeeks.snippets.enterprise.cdibeans.impl.AnotherGreetingCardImpl; import com.javacodegeeks.snippets.enterprise.cdibeans.impl.GreetingCardImpl;@Retention(RUNTIME) @Target({ FIELD, TYPE, METHOD }) public @interface GreetingType {Greetings value();public enum Greetings {HELLO(GreetingCardImpl.class), HI(AnotherGreetingCardImpl.class);Class<? extends GreetingCard> clazz;private Greetings(Class<? extends GreetingCard> clazz){this.clazz = clazz;}public Class<? extends GreetingCard> getClazz() {return clazz;}} }

現(xiàn)在,我們可以創(chuàng)建一個Producer來提供GreetingCard服務(wù)實現(xiàn)的應(yīng)用程序?qū)嵗?GreetingCardFactory.java類是具有方法getGreetingCard的Producer 。 該方法有兩個參數(shù)。 第一個參數(shù)是使用所需的bean類型參數(shù)化的javax.enterprise.inject.Instance ,在這里是GreetingCard 。 它使用@Any注釋進行注釋,該注釋允許注入點引用所有bean或特定bean類型的所有事件。 第二個參數(shù)是javax.enterprise.inject.spi.InjectionPoint ,這是客戶端應(yīng)用程序中將使用@Inject批注注入Bean的字段。 因此,該方法將根據(jù)服務(wù)類型和注入點中的注釋返回正確的服務(wù)實現(xiàn)。

GreetingCardFactory.java

package com.javacodegeeks.snippets.enterprise.cdibeans;import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.enterprise.inject.Produces; import javax.enterprise.inject.spi.Annotated; import javax.enterprise.inject.spi.InjectionPoint;public class GreetingCardFactory {@Produces@GreetingsProducerpublic GreetingCard getGreetingCard(@Any Instance<GreetingCard> instance, InjectionPoint ip){Annotated gtAnnotated = ip.getAnnotated();GreetingType gtAnnotation = gtAnnotated.getAnnotation(GreetingType.class);Class<? extends GreetingCard> greetingCard = gtAnnotation.value().getClazz();return instance.select(greetingCard).get();} }

請注意,除了將方法定義為Producer的@Produces注釋之外,該方法還帶有額外的注釋。 @GreetingsProducer批注用于注入點,以定義它使用指定的Producer方法注入bean實例。 它實際上是一個CDI限定符,如下所示:

GreetingsProducer.java

package com.javacodegeeks.snippets.enterprise.cdibeans;import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.TYPE; 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 GreetingsProducer {}

5.運行應(yīng)用程序

為了運行該應(yīng)用程序,我們創(chuàng)建了一個簡單的servlet。

在下面的servlet中,注入了兩種實現(xiàn)。 Servlet中的每個注入點都是一個使用@Inject批注的字段。 它也用@GreetingsProducer注釋進行注釋,以指定將要使用的Producer ,以及@GreetingType注釋,該注釋指定將由Producer產(chǎn)生的實現(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.GreetingType.Greetings; import com.javacodegeeks.snippets.enterprise.cdibeans.GreetingsProducer;@WebServlet(name = "greetingServlet", urlPatterns = {"/sayHello"}) public class GreetingServlet extends HttpServlet {private static final long serialVersionUID = 2280890757609124481L;@Inject@GreetingsProducer@GreetingType(Greetings.HELLO)private GreetingCard greetingCard;@Inject@GreetingsProducer@GreetingType(Greetings.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構(gòu)建項目,然后將生成的war文件放置在tomcat的webbaps文件夾中。 然后,我們可以繼續(xù):

http://localhost/8080/cdibeans/sayHello

結(jié)果是如下所示:


這是有關(guān)使用注入點檢查對Java EE CDI程序性依賴項進行歧義消除的教程。
下載本教程的源代碼: CDIDependencyDisambiguationIPInspection.zip

翻譯自: https://www.javacodegeeks.com/2013/06/java-ee-cdi-programmatic-dependency-disambiguation-example-injection-point-inspection.html

總結(jié)

以上是生活随笔為你收集整理的Java EE CDI程序化依赖关系消歧示例–注入点检查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品丝袜一区 | 一进一出好爽视频 | 日韩中文字幕视频在线观看 | 精品1区2区 | 欧美一区二区三区电影 | 国产精品久久久久久久免费看 | 手机看片一区二区 | 国产粉嫩在线 | 色天天av | 天天做天天干 | 免费无遮挡无码永久视频 | 国产第一页屁屁影院 | 四虎视频在线观看 | 99久久精 | 日韩最新网址 | 天天操婷婷 | 五月婷婷丁香激情 | www.色人阁| ass大乳尤物肉体pics | 黄色片视频 | 免费a级大片| 六月婷婷在线观看 | 越南a级片 | 亚洲成人婷婷 | 色噜噜狠狠一区二区三区 | 久久大综合 | 日韩黄色高清视频 | 91激情视频在线观看 | 92久久| 九九九久久久 | 亚洲欧美成人一区二区 | 超碰在线图片 | 欧美日韩亚洲综合 | 欧美刺激性大交 | 国产视频自拍一区 | 97少妇| 国产亚洲一区二区三区在线观看 | 久久精品国产77777蜜臀 | 国产成人一区二区三区电影 | www日本com | 叶山小百合av一区二区 | 韩国一区二区视频 | 在线视频观看一区二区 | 久久久久久久中文字幕 | 91粉色视频 | 操处女逼视频 | 中国女人一级一次看片 | 国产性精品 | 欧洲久久久 | 国产成人三级在线观看视频 | 国产精品久久久久久久9999 | 国产色在线,com | 九九色网 | 秒拍福利视频 | 波多野结衣丝袜 | 日本免费黄色网 | 草莓视频18免费观看 | 日日噜夜夜噜 | 成人一区三区 | 久久久久无码精品 | 日韩av免费 | 免费古装一级淫片潘金莲 | 欧美性生交xxxxx | 中文字幕网伦射乱中文 | 亚洲欧美视频二区 | 长河落日电视连续剧免费观看 | 午夜在线精品 | 五月激情婷婷网 | 色www国产亚洲阿娇 自拍一区在线 | 亚洲图色在线 | 日韩精品人妻一区 | 精品无码人妻一区二区三区 | 青青草国产在线视频 | 2021中文字幕 | 国产人妻一区二区 | 99少妇| 亚洲一区二区三区四区五区六区 | 国产成人久久精品流白浆 | 黑人操中国女人视频 | 99久久综合国产精品二区 | 日韩一区免费观看 | 蜜乳av网站 | 欧美亚洲国产日韩 | 久久久无码精品亚洲国产 | 日日碰日日操 | 99在线观看精品视频 | 亚洲激情av| 鲁鲁狠狠狠7777一区二区 | 性欧美videos另类艳妇3d | 天天色影综合网 | 五月婷婷操| 色噜噜狠狠一区二区三区果冻 | 黄色小视频免费观看 | 无码一区二区三区视频 | 欧美午夜三级 | 善良的女邻居在线观看 | 日韩精品一区二区三区网站 | 国产免费黄 | 在线观看的av网站 |