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