Spring启动扫描流程
2022-10-25 23:58:44 0 举报
spring启动中的扫描过程
作者其他创作
大纲/内容
条件通过后会根据当前类生成一个ScannedGenericBeanDefinition
如果是抽象类或者接口,则不通过
如果当前类和某个includeFiter匹配,那么就进行匹配筛选
获取到包路径
再进一步判断是否符合@Conditional
如果当前类和某个excludeFiter匹配,那么这个类就被排除掉
包扫描
最终扫描获取符合条件的BeanDefinition
使用ASM技术解析每个class文件对象,得到class元数据信息,循环解析
得到所有的class的元数据后,会进入isCandidateComponent(metadataReader)方法进行excludeFilters、includeFilters的判断
设置BeanDefinition的Scope(单例还是多例)
调用AnnotationBeanNameGenerator的generateBeanName()来生成默认的beanName
遍历每个BeanDefinition
启动AnnotationConfigApplicationContext容器的时候,会注册一个AnnotatedBeanDefinitionReaderClassPathBeanDefinitionScanner在scanner.scan()方法来进行扫描
如果不是顶级类,静态内部类,则不通过
最终调用到AnnotationConfigUtils.processCommonDefinitionAnnotations()方法来处理@Lazy、@Primary、@DependsOn、@Role、@Description然后将对应的属性值赋值给AnnotatedBeanDefinition
判断当前beanName是否在spring容器中已经存在,如果不存在就将beanName以及BeanDefinition注册到容器中,如果存在则直接抛异常
如果BeanDefinition是AnnotatedBeanDefinition类型就会解析@Lazy、@Primary、@DependsOn、@Role、@Description
扫描结束
在初始化ClassPathBeanDefinitionScanner的时候,会执行registerDefaultFilters()方法对includeFilters这个集合赋值(添加一个spring的注解Component和两个java规范的注解ManagedBean和Named)
得到包路径下面所有的class文件对象。(就是File对象)
如果BeanDefinition是AbstractBeanDefinition类型就会设置的默认值
先看有没有@Component,再看是否符合@Conditional
如果是抽象类,但是类上有@Lookup注解的方法则通过
收藏
0 条评论
下一页