Java EE CDI程序化依赖关系消歧示例–注入点检查
在本教程中,我們將看到在注入Java EE CDI bean時如何避免程序依賴消除歧義。 我們已經在Jave EE依賴關系消除歧義示例中展示了如何避免CDI Bean中的依賴關系歧義消除。 在這里,我們將向您展示如何以動態方式避免依賴消除歧義。 我們將通過檢查注入另一個bean的實現的bean的注入點來實現這一點。
通過創建具有兩種實現方式的簡單服務,將檢查注入點檢查的程序歧義消除。 然后,我們將創建一個Producer方法來生成和注入應用程序中的兩個實現。
我們首選的開發環境是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" 。 點擊“確定”繼續。
在向導的“輸入工件ID”頁面中,您可以定義項目的名稱和主程序包。 將“ Group Id”變量設置為"com.javacodegeeks.snippets.enterprise" ,將“ Artifact Id”變量設置為"cdibeans" 。 上述選擇組成主體工程包作為"com.javacodegeeks.snippets.enterprise.cdibeans"和項目名稱為"cdibeans" 。 將“ Package”變量設置為"war" ,以便創建一個war文件以部署到tomcat服務器。 點擊“完成”退出向導并創建您的項目。
Maven項目結構如下所示:
- 它包含以下文件夾:
- / 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:
如您所見,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.創建一個Producer方法來注入bean
為了將服務注入另一個bean,我們創建了自己的注釋。 CDI允許我們創建自己的Java批注,即GreetingType.java ,然后在應用程序的注入點中使用它,以根據bean的GreetingType獲得正確的GreetingCard實現。
Greetings是使用服務的實現參數化的枚舉,如下所示:
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;}} }現在,我們可以創建一個Producer來提供GreetingCard服務實現的應用程序實例。 GreetingCardFactory.java類是具有方法getGreetingCard的Producer 。 該方法有兩個參數。 第一個參數是使用所需的bean類型參數化的javax.enterprise.inject.Instance ,在這里是GreetingCard 。 它使用@Any注釋進行注釋,該注釋允許注入點引用所有bean或特定bean類型的所有事件。 第二個參數是javax.enterprise.inject.spi.InjectionPoint ,這是客戶端應用程序中將使用@Inject批注注入Bean的字段。 因此,該方法將根據服務類型和注入點中的注釋返回正確的服務實現。
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.運行應用程序
為了運行該應用程序,我們創建了一個簡單的servlet。
在下面的servlet中,注入了兩種實現。 Servlet中的每個注入點都是一個使用@Inject批注的字段。 它也用@GreetingsProducer注釋進行注釋,以指定將要使用的Producer ,以及@GreetingType注釋,該注釋指定將由Producer產生的實現。
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構建項目,然后將生成的war文件放置在tomcat的webbaps文件夾中。 然后,我們可以繼續:
http://localhost/8080/cdibeans/sayHello
結果是如下所示:
這是有關使用注入點檢查對Java EE CDI程序性依賴項進行歧義消除的教程。
下載本教程的源代碼: CDIDependencyDisambiguationIPInspection.zip
翻譯自: https://www.javacodegeeks.com/2013/06/java-ee-cdi-programmatic-dependency-disambiguation-example-injection-point-inspection.html
總結
以上是生活随笔為你收集整理的Java EE CDI程序化依赖关系消歧示例–注入点检查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度:未来竞争在于做出多少 AI 原生应
- 下一篇: 荣耀30s有线性马达吗