繁体   English   中英

创建我自己的注释Java

[英]Create my own Annotation Java

这是我第一次创建Annotation Java,并且想创建自己的注释,然后在必要时禁止执行测试。 问题是我很多测试都必须使用Facebook api,有时它们无法正常工作,因此我想要一个名为@Facebook的注释,将其添加到测试中时可以用作@Suppress注释,因此编写了以下代码。 。不幸的是,它不起作用。 有人可以帮助我吗?

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

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表示您定义了一个新的限定符,实际上是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构造以不同的方式implements 使用先前定义的注释,您可以在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等中进行选择,每种实现@LinkedIn其特定的Java实现类( public class Facebook替代public class Facebook )。

现在,您可以在Java类中使用CDI注入所选的Java实现。

应用了CDI的后端Java Bean( BackendSocialMediaAnalysis.java ):

public class BackendSocialMediaAnalysis {
   ...
   @Inject @Facebook
   private SocialMediaService genericMediaService;
   ...
}

@Facebook替换@Facebook @LinkedIn导致将替代(LinkedIn)实现加载到genericMediaService中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM