component是什么接口_spring core:@Component的派生性

688df4941a15ba41144055b94df2ffa1.png

spring对注解的拓展,早已超越J2EE的规约。通过注解可以实现其派生性(Annotation Hierarchy)。自从spring2.5开始,每个大版本都对其进行了增强。

需要了解更多java知识的朋友关注我的专栏,每天持续更新java知识。

Java架构杂货铺​zhuanlan.zhihu.com
db3d8827a7ac4e9a8bdb8970d391c6a2.png

何为派生?

没错一般能想到的就是属性派生,直接上代码,其实Parent和Child看似是派生的关系,但实则并无关系!

它们是两个毫无关联的接口(我在面试的时候会提问:注解和接口的关系),通过javap -v .Child.class便可得知

@Target

那派生就不是真正意义上的派生(Override),而spring对其加以拓展,将其界定在层次性:

@Parent
        	

也就是说,有层次结构的注解,spring就认定是具备派生性(extends),并且派生性强调的类型(Child extends Parent)。

Component

在spring中有很多*@Repository,@Service,@Controller,@Configuration等,均派生于@Component,这也就是为什么你添加了一个注解(只需要标记为@Component),而不用改动spring core。

  • Spring2.5 仅支持单层次的@Component派生,未采用层次递归获取Annotation[]
  • Spring3.x 实现仅两层@Component派生
  • Spring4.x开始采用递归方式查找元注解
@Target

原理-AnnotationMetadataReadingVisitor

MetadataReaderFactory,读取类或者注解相关信息有两种方式:反射和ASM。

  • ClassMetadata,类元信息抽象,StandardClassMetadata(反射),ClassReader(ASM)
  • MethodMetadata,方法元信息抽象,StandardMethodMetadata(反射),MethodMetadataReadingVisitor(ASM)
  • AnnotationMetadata,注解元信息抽象,StandardAnnotationMetadata(反射),AnnotationMetadataReadingVisitor(ASM)
  • AnnotationAttributes,注解属性抽象
  • MetadataReader,元信息读取抽象,通过MetadataReaderFactory获取

而``AnnotationMetadataReadingVisitor的内部实现使用AnnotationAttributesReadingVisitor`类来递归的查找元注解。反射的API类`AnnotationUtils`易用性则更强。

那要满足真正意义上的派生,不仅仅时类型,spring为此开发了@AliasFor。

作者:「布道」

原文链接:https://blog.csdn.net/alex_xfboy/article/details/103783052

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值