![](/img/trans.png)
[英]Is it possible to create my own Custom Annotation that act as Spring @Controller annotation?
[英]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.