1

这是我第一次创建 Annotation Java,我想创建一个自己的注解,然后在必要时禁止执行测试。问题是我的许多测试都必须使用 Facebook api,有时它们不起作用,所以我想要一个名为 @Facebook 的注释,当添加到测试中时它作为 @Suppress 注释工作,所以我编写了以下代码.. .那不幸的是不起作用。任何人都可以帮助我吗?

        @Retention(RetentionPolicy.RUNTIME)
        public @interface Facebook {
            Suppress notToBeRun() default @Suppress;
        }
4

1 回答 1

1

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表示您定义了一个新的限定符,实际上是@FacebookJava 注入机制已知的唯一名称 ( )。

@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);
}

该接口可以通过implementsJava 构造以不同的方式实现。使用先前定义的注释,您可以在 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 中的结果。

于 2017-06-09T19:58:01.513 回答