Meta 注解、Composed 注解 这个元注解的定义:不是特别的清除,在后面的文章中提到过:它只是提供元数据的注解,这样的注解就可以叫做元注解
Spring 提供的许多注解都可以在你自己的代码中作为元注解使用。元注解是一个可以应用于另一个注解的注解。例如,前面提到的 @Service
注解是用 @Component
进行元注解的,如下例所示:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // 这里使用了 @Component,@Service 与 @Component 的处理方式相同。
public @interface Service {
// ...
}
你也可以结合元注解来创建 「组合注解」。例如,Spring MVC 的 @RestController
注解是由@Controller
和 @ResponseBody
组成。
此外,组成的注解可以选择性地重新声明来自元注解的属性以允许定制。当你想只暴露元注解的一个子集的属性时,这可能特别有用。例如,Spring 的 @SessionScope
注解将作用域名称硬编码为 session,但仍然允许自定义 proxyMode。下面的列表显示了 SessionScope 注解的定义。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_SESSION)
public @interface SessionScope {
/**
* Alias for {@link Scope#proxyMode}.
* <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}.
*/
@AliasFor(annotation = Scope.class)
ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}
然后,您可以使用 @SessionScope
,而不必声明 proxyMode 如下所示:
@Service
@SessionScope
public class SessionScopedService {
// ...
}
你也可以覆盖 proxyMode 的值,如下面的例子所示:
@Service
@SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
public class SessionScopedUserService implements UserService {
// ...
}
有关详细信息,请参阅 Spring Annotation Programming Model wiki 页面。