Java 包含一个灵活的注释 API,具有多种应用可能性。最初开发用于在 Java EE 堆栈中指定企业语义(Java-bean 是无状态的还是有状态的、单例的等),注解接口现在也普遍用于 Java 中的上下文相关注入 (CDI)。您的问题涉及如何将 Java 注释 API 用于 CDI。
首先,您需要为希望 Java 注入的每个特定用户定义的 CDI 选项定义一个限定符接口类。您希望通过注入加载 Facebook 实现。您的界面 ( Facebook.java ) 如下所示:
@Qualifier
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Facebook {
}
第一个术语@Qualifier
表示您定义了一个新的限定符,实际上是@Facebook
Java 注入机制已知的唯一名称 ( )。
@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 示例(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 实现。
应用 CDI的后端 Java bean ( BackendSocialMediaAnalysis.java ):
public class BackendSocialMediaAnalysis {
...
@Inject @Facebook
private SocialMediaService genericMediaService;
...
}
替换@Facebook
为@LinkedIn
将替代 (LinkedIn) 实现加载到 genericMediaService 中的结果。