Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春季定制注解_Java_Spring - Fatal编程技术网

Java 春季定制注解

Java 春季定制注解,java,spring,Java,Spring,我很少看到使用自定义注释的示例。范例 @SimpleAnnotation class SampleBean { @SimpleAnnotation public String getName() { return "AAA"; } public void setName(String name) { } public int getHeight() { return 201; } } @Target( { ElementType.METHOD,

我很少看到使用自定义注释的示例。范例

@SimpleAnnotation
class SampleBean {
  @SimpleAnnotation
  public String getName() {
    return "AAA";
  }

  public void setName(String name) {
  }

  public int getHeight() {
    return 201;
  }
}

@Target( { ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@interface SimpleAnnotation {
}

有人能告诉我们为什么要使用它吗?

使用自定义注释的最佳部分是,您不必进行任何配置,Spring将自动检测这些bean是服务组件,一切都会正常工作。自定义注释是Spring中添加的一个非常小的功能,但非常有用

两个选项:

  • 您需要自定义批注上的
    @组件
    批注。这样,您就可以使用自定义注释将类标记为bean。此外,还可以添加默认范围和其他元信息

  • 限定符-您可以使用限定符注释(用
    @qualifier
    元注释注释)来区分相同接口的实现


您可以创建自己的元注释,收集其他几个Spring注释,以减少代码中的元样板:

@Service
@Scope(value = "prototype")
@Transactional(readOnly = true, rollbackFor = RuntimeException.class)
public @interface ReadOnlyService {}
然后你可以简单地写:

@ReadOnlyService
public class RoleService {

}
Spring将找到
@ReadOnlyService
,并在语义上将其替换为:

@Service
@Scope(value = "prototype")
@Transactional(readOnly = true, rollbackFor = RuntimeException.class)
public class RoleService {

}
当然,如果您有大量的服务使用相同的Spring注释集进行注释,而这些注释集可以替换为一个命名良好的注释,那么使用自定义注释是值得的


示例取自:

Spring支持许多注释“元注释”的概念。(我不确定这是否是为了所有人。)

这意味着您可以构建自己的注释,并使用其中一个Spring“核心”注释对注释进行注释

例如:

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Service
public @interface MyService {

}
然后您可以使用此注释而不是
@Service
。(顺便说一句:
@服务
@存储库
@控制器
使用相同的技术从
@组件
中“继承”)


大量使用此功能的一个示例是从
@Qualifier
中“继承”。 有关示例和一些解释,请看一看(本章末尾是带有
@Genre
的示例。)

使用该技术可以实现的一个非常有用的构造是,它使您能够将多个注释组合成(在您的用例中)更具意义的注释。因此,不要在某些类型的每个类上都编写相同的两个注释,例如:
@Service
@Qualifiyer(“someting”)
(org.springframework.beans.factory.annotation.Qualifier)。您可以创建使用这两个注释进行注释的自定义注释,然后在bean中仅使用这一个自定义注释。(@See)

如果您想了解这项技术的使用能力,可以看看上下文和依赖项注入框架


评论中的问题:

@interface中还定义了一些变量,这意味着什么

注释(由@Interface定义)的工作方式有点像bean。这些字段是使用注释时可以/必须定义的属性。以后可以通过反射API读取这些值

例如,Spring中的
@Controller
注释:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
   String value() default "";
}

名为
value
的字段是可以在没有明确名称的情况下使用的字段:(
@Controller(“myUrl”)
是相同的
@Controller(value=“myUrl”)

一种常见模式也是在AOP切入点中使用注释。不是专门针对Spring的,但在使用Spring AOP时经常使用。

自定义注释本身不起任何作用。它们是代码中的简单标记。它们真正的力量来自于寻找特定注释的工具。和其他一些答案一样,Spring有多种注释用途,现在有了定义自己组件类型的机制。相当整洁。另一个例子是,几周前,我使用AOP和一些自定义注释来提供简单的方法级结果缓存。现在我已经准备好了缓存引擎,并定义了相应的AOP钩子,如果我想缓存一个方法,我只需添加该注释。有些人只是将注释作为花哨的元数据来提高可读性


归根结底,它们是一个相当简单的工具,可以用于很多事情。

Tomasz:我看到了一些例子,它还使用@ReadOnlyService公共类RoleService{string var;}在您所解释的示例中,这意味着什么?这意味着您可以用一个注释代替这三个注释,而不是反复使用这三个注释。Ralph:interface中还定义了一些变量,这意味着什么?@Junaidaj:See我的扩展答案