注解的派生性
注解有派生性:在SpringFramework 4.0 中通过递归的方式查找元注解,实现了注解的派生性;在3.0 支持两层继承;在2.0中支持单继承
派生性导致了覆盖:在Spring中,由于注解的查找方式(递归查找),底层(对比子类理解)注解可以覆盖高层(对比超类理解)注解的同名属性。
注意:在Java 编程语言级别上,Java注解是绝对静态性的,且属性方法是表达注解状态的唯一途径。并且注解是不可继承或实现的。上文所说的派生性是指Spring层面上,由于Spring中注解的查找方式(递归查找)而产生的派生性。
Spring中注解分类
元注解(Meta-Annotations):
指能声明在其他注解上的注解,在java中元注解有@Document、@Repeatable等,在Spring使用场景中,元注解有@Component等
Spring模式注解(Stereotype Annotations):
用来表明组件在应用中扮演什么角色的注解, 比如@Repository作为仓储标记注解,管理和存储某种领域的对象。(注解有派生性)
Spring 组合注解(Composed Annotations):
指某个注解“元标注”(被标注)一个或多个其他注解,其目的在于将这些关联的注解行为组合成单个自定义注解。
比如:@TransactionalService 注解标注了 @Transactional 和 @Service注解,因此@TransactionalService注解组合了这两个注解的语义。
@Transactional 是个元注解,是Spring事务注解;
@Service 是Spring模式注解,被@Component标注
Spring 注解属性别名和覆盖(Attribute Aliases and Override):
String Framework 为Spring 元注解和@AliasFor 提供了属性覆盖和别名的特性。
实现了属性值在注解结构中的传递行为。
@AliasFor
显性别名:在同一注解中的两个属性方法相互标注@AliasFor,且这两个属性方法的默认值必须相同,这样的行为称为显性别名。
隐形别名:如@TransactionalService这样的注解,通过注解属性方法name()和value()相互“@AliasFor”,并且value()又覆盖了@service.value()属性,因此@TransactionalService.name()与@Service.value()之间的关系被称为“隐性别名”。
不同层次注解属性之间也可通过@AliasFor设置别名
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class
)
Class<?>[] exclude() default {};
...
}
例如:@SpringBootApplication 在exclude()属性上与其元注解@EnableAutoConfiguration建立了单向@AliasFor关系。
如果反向建立关系,是不合理的,Spring元注解之间不应该相互元标注。
简而言之,多层次注解属性之间的@AliasFor 关系只能由较低层向较高层建立。
读《Spring Boot 编程思想(核心篇)》部分章节内容总结