Meta 注解、Composed 注解 这个元注解的定义:不是特别的清除,在后面的文章中提到过:它只是提供元数据的注解,这样的注解就可以叫做元注解

    Spring 提供的许多注解都可以在你自己的代码中作为元注解使用。元注解是一个可以应用于另一个注解的注解。例如,前面提到的 @Service注解是用 @Component进行元注解的,如下例所示:

    1. @Target(ElementType.TYPE)
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Component // 这里使用了 @Component,@Service 与 @Component 的处理方式相同。
    5. public @interface Service {
    6. // ...
    7. }

    你也可以结合元注解来创建 「组合注解」。例如,Spring MVC 的 @RestController注解是由@Controller@ResponseBody组成。

    此外,组成的注解可以选择性地重新声明来自元注解的属性以允许定制。当你想只暴露元注解的一个子集的属性时,这可能特别有用。例如,Spring 的 @SessionScope注解将作用域名称硬编码为 session,但仍然允许自定义 proxyMode。下面的列表显示了 SessionScope 注解的定义。

    1. @Target({ElementType.TYPE, ElementType.METHOD})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Scope(WebApplicationContext.SCOPE_SESSION)
    5. public @interface SessionScope {
    6. /**
    7. * Alias for {@link Scope#proxyMode}.
    8. * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}.
    9. */
    10. @AliasFor(annotation = Scope.class)
    11. ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
    12. }

    然后,您可以使用 @SessionScope,而不必声明 proxyMode 如下所示:

    1. @Service
    2. @SessionScope
    3. public class SessionScopedService {
    4. // ...
    5. }

    你也可以覆盖 proxyMode 的值,如下面的例子所示:

    1. @Service
    2. @SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
    3. public class SessionScopedUserService implements UserService {
    4. // ...
    5. }

    有关详细信息,请参阅 Spring Annotation Programming Model wiki 页面。