SpringBoot自动装配的过程
2024-04-25 15:36:40 0 举报
仅作为学习SpringBoot的资料
作者其他创作
大纲/内容
loadBeanDefinitionsForConfigurationClass
A2
准备上下文对象prepareContext
A1
configurations = getConfigurationClassFilter().filter(configurations);
ctor.newInstance(argsWithDefaultValues)
此方法会创建一个上下文对象,并且会将BeanFactory进行初始化,将一些内置的BeanDefinition注入到工厂中
(ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
先会构建父类的构造方法
deferredImports.forEach(handler::register);
refreshContext
此方法主要是把刚刚解析到的自动装配的全路径类名全部注入到BeanDefinitionMap中,一个类如果声明了@Bean相关注解,都会被注入
获取spring.factories文件下符合条件的EnableAutoConfiguration应该考虑的自动配置的全路径类名
this.deferredImportSelectorHandler.process();
invokeBeanDefinitionRegistryPostProcessors
AbstractApplicationContext.refresh
ServletWebServerApplicationContext
1
准备上下文对象的的时候,会执行一个load,load是将声明了SpringBoot的主启动类找出来,并注入到BeanDefinition中,便于后续解析主启动类
解析完主启动类的@impor标签放入集合deferredImportSelectors中,返回至parse然后开始执行第二步骤
GenericWebApplicationContext
处理任何@PropertySource注释,处理任何@ComponentScan注释,处理任何@Import注释,处理任何@ImportResource注释,处理单个@Bean方法
instantiateClass
ConfigurationClassParser类parser.parse(candidates);
processConfigurationClass
deferredImportSelectors中拿到的数据放入到DeferredImportSelectorGroupingHandler类的groupings的map中
beanFactory.preInstantiateSingletons();
第二步,通过拿到的全路径类名,然后用forEach的循环,进入以下方法,其实processImports这个方法就是再从已经拿到的类名做递归,看看当中的类有没有加额外的注解需要解析
2
handler.processGroupImports();
AnnotationConfigServletWebServerApplicationContext
开始调用Spring的刷新方法
load
finishBeanFactoryInitialization
this.reader.loadBeanDefinitions(configClasses)
((AutoConfigurationImportSelector) deferredImportSelector).getAutoConfigurationEntry(annotationMetadata);
invokeBeanFactoryPostProcessors
AnnotatedBeanDefinitionReader
SpringApplication.run
类解析完成的import注解,会放入到deferredImportSelectors的集合中
doProcessConfigurationClass
通过配置拿到了相关要自动装配的全路径类名后,返回给DeferredImportSelectorGroupingHandler类的processGroupImports方法
processImports
GenericApplicationContext
registerAnnotationConfigProcessors
AutoConfigurationImportSelector类getCandidateConfigurations
processConfigBeanDefinitions
过滤掉不符合逻辑的全路径类名,比如项目没有用到的redis,mysql,那么其中的类名都会被过滤,只留下需要的
createApplicationContext()
大部分的BeanDefinition都会在此方法进行Bean的生命周期,并放入到SingletonObjects一级缓存中
new AnnotatedBeanDefinitionReader(this);
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(registry);
创建上下文对象
grouping.getImports()
此构造方法会声明出一个工厂new DefaultListableBeanFactory()
收藏
0 条评论
回复 删除
下一页