ASM在Spring中的应用

背景

非常粗糙的看spring源码,多次发现ASM在源码中的应用,简单记录下。
我的职业就是JavaAgent,对于ASM还是比较熟悉的。
ASM不仅可以在代码运行的过程中读取相应的信息,还可以修改字节码,是一个相当不错的框架。
ASM虽然很好,但是还是会添加新的逻辑,势必会消耗性能的,所以能够不用的话就不要用了,比如我们比较熟悉的@RequestParam(“name”),就可以省去ASM读取方法参数名称的操作(反射只能得到参数的类型,无法的到参数的名称)

下面看下如何在源码中找到ASM在Spring中的应用(只提供找到ASM的线索,不介绍ASM用法)

注册注解BeanDefinition

看到ClassPathScanningCandidateComponentProvider这个类中的addCandidateComponentsFromIndex()方法,找到AnnotatedGenericBeanDefinition sbd = new AnnotatedGenericBeanDefinition( metadataReader.getAnnotationMetadata());这段代码。
在这里插入图片描述
getAnnotationMetadata()方法,从字面意思理解是得到Bean的元信息。
到了SimpleMetadataReader类

final class SimpleMetadataReader implements MetadataReader {
	private final AnnotationMetadata annotationMetadata;
	@Override
	public AnnotationMetadata getAnnotationMetadata() {
		return this.annotationMetadata;
	}
}

那么返回的就是annotationMetadata 这个字段,这是一个接口,我们看其中的一个实现类AnnotationMetadataReadingVisitor
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实ASM简单来说就是集成ClassVisitor,然后重写里面的一系列visit***方法,通过直接修改字节码命令的方式,达到在运行期间修改字节码的技术。

好吧,不仅找到了AnnotationMetadataReadingVisitor,还找到了ClassMetadataReadingVisitor,赚大发了,在看到后缀带着Visitor基本上就柳暗花明了。
可以看到Spring中对于ASM用的还是不少的,重写了其中的visitvisitInnerClassvisitMethodvisitField

发布了525 篇原创文章 · 获赞 2337 · 访问量 217万+

猜你喜欢

转载自blog.csdn.net/dataiyangu/article/details/104443839
ASM
今日推荐