spring Bean定义流程图
2022-05-10 22:24:55 0 举报
spring中类是如何被扫描成bean定义的
作者其他创作
大纲/内容
retrieveBeanMethodMetadata(sourceClass)
2
loadBeanDefinitionsFromImportedResources
创建一个配置类解析器ConfigurationClassParser
如果是Imported导入的一般类
parser.parse(candidates);
第二步:为容器中注册系统的bean定义信息
注册一个配置类解析器的bean定义(ConfigurationClassPostProcessor)
@PropertySource
自己无参构造函数
registerBeanDefinitionForImportedConfigurationClass
92行:invokeBeanDefinitionRegistryPostProcessors
@Bean
默认扫描@Component @Service @Repository @Controller @Aspectj
由于上面只是注册了@ComponentScan的定义,其他从这里注册
this()
org.springframework.context.support.GenericApplicationContext#registerBeanDefinition
获取@bean的方法
调用父类的无参构造函数
从beanFactory中获取BeanDefinitionRegistryPostProcessor的定义信息
this.includeFilters.add(new AnnotationTypeFilter( ((Class<? extends Annotation>) ClassUtils.forName(\"javax.annotation.ManagedBean\
添加beanDefinitions
registerDefaultFilters()
this.includeFilters.add(new AnnotationTypeFilter(Component.class));
JSR-250
4
beanDefinitions.add(definitionHolder);
processImports
refresh
递归走到
org.springframework.context.annotation.ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry
调用接口selector.selectImports(currentSourceClass.getMetadata());
5
创建一个条件计算器对象conditionEvaluator
否
开始
判断是否需要创建一个IOC 容器
校验是否解析完成alreadyParsed.addAll(configClasses);
构造函数
org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition
是
register
如果是@bean 方法
scanner.doScan(StringUtils.toStringArray(basePackages))
scanner
注册自己传入的主配置类bean定义到容器中
扫描bean定义
org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors
递归do while循环
其他
添加到主类的importBeanDefinitionRegistrars
添加到主类的BeanMethod中
入参为mainconfig
结束
this.reader.loadBeanDefinitions(configClasses);
注意此时还没有注册bean定义信息
3
@Import
注册包扫描默认的规则
JSR-330
第一步
@ComponentScan
排序:sortPostProcessors
如果是Imported引入ImportBeanDefinitionRegistrar
初始化 this.reader = new AnnotatedBeanDefinitionReader(this);\t\tthis.scanner = new ClassPathBeanDefinitionScanner(this);
loadBeanDefinitionsForBeanMethod
如果是importResources
doProcessConfigurationClass
是否为ImportBeanDefinitionRegistrar
1
org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass
调用内部方法
注册解析@EventListener的注解
reader
While 循环
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)
过滤处理我们传入的主配置类
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
是否为ImportSelector
参数为ConfigurationClassPostProcessor的解析器
AnnotationConfigApplicationContext
调用接口方法
第一步:初始化this.resourcePatternResolver = getResourcePatternResolver()第二步:GenericApplicationContext(),初始化beanFactory
@ImportResource
注册解析@Required 注解的处理器
注册AutoWired注解解析器的bean定义信息AutowiredAnnotationBeanPostProcessor
processConfigBeanDefinitions
注册bean定义信息
检查是否支持jpa,若支持注册解析jpa规范的注解
0 条评论
回复 删除
下一页