spring代码流程
2023-04-21 15:42:30 0 举报
AI智能生成
1
作者其他创作
大纲/内容
new AnnotationConfigApplicationContext(AppConfig.class);
this();
初始化Factory
初始化reader
注册开天辟地5个bd
bdMap添加:ConfigurationClassPostProcessor
bdMap添加:AutowiredAnnotationBeanPostProcessor
bdMap1添加:CommonAnnotationBeanPostProcessor
bdMap添加:DefaultEventListenerFactory、EventListenerMethodProcessor
初始化scanner
register(componentClasses);
this.reader.register(componentClasses);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
refresh();
invokeBeanFactoryPostProcessors前
invokeBeanFactoryPostProcessors(beanFactory);
ConfigurationClassPostProcessor
BeanDefinitionRegistryPostProcessors.postProcessBeanDefinitionRegistry
基于注册表构建和验证配置模型
processConfigBeanDefinitions
(人话:扫描指定包下的类@Bean、@Import、@Component、@ComponentSacn等)
获取候选的(@Configuration的类)放入configCandidates集合中
创建@Configration的配置类的解析器并开始解析:ConfigurationClassParser
parse----processConfigurationClass
doProcessConfigurationClass
解析@Component的注解
解析@PropertySources注解
解析@ComponentScan注解
处理@Import注解
ImportSelector类型
ImportBeanDefinitionRegistrar类型
其他类型
处理@ImportResource注解
处理本身的 @Bean方法
处理默认的接口方法
解析收集完成后,进行缓存
this.configurationClasses.put(configClass, configClass);
注册扫描到的类的bd
BeanFactoryPostProcessor.postProcessBeanFactory
enhanceConfigurationClasses
判断是否是一个全配置类并进行ConfigurationClassEnhancer增强
其他实现BeanFactoryPostProcessor后置处理器
注册bean后置处理器
registerBeanPostProcessors(beanFactory);
finishBeanFactoryInitialization(beanFactory);
getBean----doGetBean
transformedBeanName
检查bean名称是否合法
处理dependsOn,保证当前 bean 所依赖的 bean 的初始化。当前bean是否有关联bean
创建:getSingleton----createBean
resolveBeanClass
resolveBeforeInstantiation
AbstractAutoProxyCreator
doCreateBean
createBeanInstance(beanName, mbd, args);
instantiateUsingFactoryMethod
判断构造方法是否被解析过
determineConstructorsFromBeanPostProcessors
SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors
(子类)AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors()
处理@LookUp
从candidateConstructorsCache缓存中拿
找“构造方法”
放入缓存candidateConstructorsCache,并返回
根据上面推断的构造方法执行构造:
autowireConstructor or instantiateBean
autowireConstructor
instantiateBean
执行默认:constructorToUse = clazz.getDeclaredConstructor();
判断是否支持循环依赖
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory)
getEarlyBeanReference(beanName, mbd, bean)
wrapIfNecessary(bean, beanName, cacheKey);
属性填充populateBean
初始化initializeBean(beanName, exposedObject, mbd);
收藏
0 条评论
下一页