SpringBoot是如何处理注解的?
本⽂基于Spring 5.2.7
这是个很⼤的话题,但是是个⾮常实在的话题,注解天天⽤,处处⽤,请问你知道他是怎么起作⽤的吗?
如果你使⽤了注解,那么⼀定有代码在什么地⽅检索这个注解,并为这个注解的语义写了对应的逻辑。但是注解本⾝是没有任何⾏为的,他只是⼀个标记⽽已。所以注解是惰性的,看到注解时并没有⾏为,你需要到注解对应的⾏为才能理解注解实际的作⽤。
但是要到⼀个注解对应的⾏为很难,因为很多注解都是些三⽅库提供的,要想到每个注解对应的⾏为有如⼤海捞针,所有成事者⼀定是有志⽓的⼈。
⼀、SpringBoot启动
SpringBoot要解析那些注解在代码中已经写死了,所有注解的解析都是按照既定的顺序在执⾏,如@Configuration,@Import,这些都会在启动过的时候解析,所以⼀切的起点是启动类上,但是,我们会看到启动类上往往是⼀个汇总的注解,如
@EnableTransactionManagement,然后这个类上⾯会引⼊其他注解,那Spring是怎么解析到他引⼊的注解的呢?
原理就是Spring在扫描注解是⼀种递归的⽅式,⽐如在处理@Import注解时,就会递归处理:
t.annotation.ConfigurationClassParser#collectImports(...)
private void collectImports(SourceClass sourceClass, Set<SourceClass> imports, Set<SourceClass> visited)
throws IOException {
if (visited.add(sourceClass)) {
for (SourceClass annotation : Annotations()) {
String annName = Metadata().getClassName();
if (!annName.equals(Name())) {
collectImports(annotation, imports, visited);
}
}
imports.AnnotationAttributes(Name(), "value"));
}
}
这是Spring在启动时解析配置时,递归解析注解,这⾥的sourceClass就是启动类,然后递归检查启动类上的@Import注解,所以才能检查到注解上的注解。springboot是啥
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论