Spring中的注解 -- 概述

Spring中的注解 – 概述

概述

随着Spring版本的更新以及子项目的发展,使用注解方式配置已经是现在Spring应用中首选,版本结合之前Spring 扩展及初始化过程分析一问中的介绍对Spring中注解的实现原理进行简要的描述。

注解的工作原理及问题

抛开Spring注解不谈,Java注解一般的应用方式如下:

  • 自定义注解,并将注解编写到目标类、属性或方法上
  • 在运行时通过反射获取类、属性或方法上的注解信息
  • 根据获取的注解或注解内的属性值进行逻辑处理

从以上的方式,我们可以很容易的发现问题:

  1. 随着注解的广泛使用,注解会越来越多,如何查询注解API
  2. 每次添加新注解时,我们都需要修改原有注解处理逻辑
  3. 由于注解信息是通过反射获取的,而反射性能是较差的,所以对于充斥大量注解的程序在解析注解时性能是一个问题

Spring中的解决方式

  • 问题1

对于问题1,从目前来看,Spring是依靠Tutorials或Getting Started部分的介绍来描述,并通过javadoc或源码来边用边查询,没有统一的管理、索引位置。有知道的朋友可以告诉下,谢谢!

自己写了一个扫描指定目录下所有的jar包内注解的工具类,后续需要完善与javadoc的连接。

  • 问题2

问题2,Spring中在设计注解时根据注解的功能将注解分层,对于新添加的注解只需要内部嵌套底层注解并修改对应层级或组件的注解解析逻辑。避免整体修改,提高注解处理弹性。

此处所述的注解指Spring自定义的注解不包括其他标准或类库定义的注解,例如JSR-250和JSR-330定义的ManagedBean和Named等。

  • 问题3

为避免性能问题,Spring中使用ASM(ClassReader+ClassVisitor)获取注解的嵌套关系,从而获得某个类的直接注解和注解包含的嵌套注解

ASM读取的工作原理为ClassReader直接读取class文件或字节数组,根据Java的Class文件规范将class文件读取为一个字节数组,然后通过ClassReader内部的accept方法按class文件的不同部分回调ClassVisitor中的不同方法,建议直接阅读源码。

猜你喜欢

转载自blog.csdn.net/woshismyawei/article/details/80191111