Spring扫描底层流程
2023-02-17 11:18:05 0 举报
Spring中扫描class文件的内容生成BeanDefinition
作者其他创作
大纲/内容
默认情况下,Spring会有一个@Component注解的includeFilter
如果当前类和某个excludeFilter匹配,那就排除这个类
最终扫描得到一些BeanDefinition
都匹配成功后,根据当前类生成一个ScannedGenericBeanDefinition
扫描结束
如果当前类和某个includeFilter匹配,那就通过这个类
设置scope属性
进一步进行条件注解@Conditional的匹配筛选
有个跟代理相关的逻辑(未细看)
利用ASM技术解析每个class文件,得到class的元数据信息
给BeanDefinition对象中的属性赋默认值
包路径
判断当前beanName是否在Spring容器中已经存在,如果不存在则把beanName以及BeanDefinition注册到Spring容器中,如果存在则分情况。
如果不是顶级类,或静态内部类,则不通过
DefaultListableBeanFactory#allowBeanDefinitionOverriding属性为false的时候,才会报错。(默认值为true)
如果有autowireCandidatePatterns,根据beanName判断一下当前BeanDefiniton对应的Bean能否作为其它Bean的自动注入候选Bean。并将结果设置到BeanDefinition的autowireCandidate属性中。
如果是抽象类,但是有@Lookup注解的方法,则通过
解析@Component注解所指定的beanName,没有指定则默认生成
解析@Lazy、@Primary、@DependsOn、@Role、@Description等注解并赋值给BeanDefinition对应的属性
调用AnnotationBeanNameGenerator生成beanName
如果是抽象类或接口,则不通过
org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan
得到包路径下的所有class文件对象,注意是抽象之后的Resource对象
遍历每个BeanDefinition
0 条评论
下一页