Spring 注解驱动编程

注解的派生性

注解有派生性:在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 编程思想(核心篇)》部分章节内容总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值