Java包含一個靈活的註釋API,其中包含許多應用程序可能性。首先開發用於指定Java EE堆棧中的企業語義(無論Java bean是無狀態還是有狀態,單例等),現在註釋接口也已經在Java中用於上下文相關注入(CDI)。您的問題解決了如何使用CDI的Java註釋API。
首先,您需要爲每個想要Java注入的特定用戶定義的CDI選項定義一個限定符接口類。你想通過注入來加載Facebook的實現。你的界面(Facebook.java)可以如下所示:
@Qualifier
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Facebook {
}
中的第一項,@Qualifier
表明您定義一個新的限定詞,實際上是由Java的注射機構已知的唯一名稱(@Facebook
)。
@Target
註釋表示您的註釋可以在Java類型聲明,Java字段(特別是變量聲明)或方法參數之前。您可以添加第四個限定符,以允許您的註釋也可以在方法之前使用,即ElementType.METHOD
。
@Documented
定義了一個註釋,確保使用此註釋的類在其生成的JavaDoc中顯示此註釋。 @Retention
必須設置爲RetentionPolicy.RUNTIME
,以便當Java應用程序啓動時(在Web應用程序服務器上下文中部署)註釋變爲活動狀態。
現在,您需要定義一個通用的Java接口類(SocialMediaService.java),只是一個普通的Java接口:
public interface SocialMediaService {
boolean login(String userId, String password);
void logout();
String searchForMessages(String[] friends);
}
這個接口可以通過不同的方式來實現,由implements
的Java方法-構造。 使用先前定義的註釋,您可以在Java代碼中選擇 要使用的替代實現。
這裏是一個Java的類的實-示例(Facebook.java,在不同包大於接口限定符類,上面指定的):
@Facebook
public class Facebook implements SocialMediaService {
@Override
public boolean login(String userId, String password) {
...
your application logic
...
return true;
}
@Override
public void logout() {
...
your application logic
...
}
@Override
public String searchForMessages(String[] friends) {
...
your application logic
...
return searchResult;
}
}
可以在衆多的選擇不同的實現@LinkedIn
等,每個實現都具有它們特定的Java實現類(public class Facebook
的替代)。
在你的Java類中,你現在已經準備好使用CDI來注入選擇的Java實現。
後端Java bean(BackendSocialMediaAnalysis。其中被施加CDI的java):
public class BackendSocialMediaAnalysis {
...
@Inject @Facebook
private SocialMediaService genericMediaService;
...
}
在替代方案中更換@Facebook
由@LinkedIn
結果(LinkedIn)執行被加載到genericMediaService。
不是你要求的,但假設你想要的是禁用JUnit測試,爲什麼不使用@Ignore? – haylem
只需要一個簡單的方法來再次找到標記爲Facebook廣告的所有測試:) – Shilaghae
然後,您可以使用:@Ignore(「Facebook」)或者@Ignore(Reason.FACEBOOK),其中Reason是枚舉。 – Puce