spring-bean生命周期

本文章基于版本SpringBoot-2.7.12

1、通过ClassPathBeanDefinitionScanner把beandefinition放入到beandefinitionMap中

//查看AbstractApplicationContext的refresh()方法里的#290#行
this.invokeBeanFactoryPostProcessors(beanFactory);
//查看PostProcessorRegistrationDelegate的invokeBeanFactoryPostProcessors方法里的#79#行
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
//通过PostProcessorRegistrationDelegate的invokeBeanDefinitionRegistryPostProcessors方法里的#256#行,实现bean定义注册后置处理器
postProcessor.postProcessBeanDefinitionRegistry(registry);
//通过ConfigurationClassPostProcessor的processConfigBeanDefinitions方法里的#213#行,
parser.parse(candidates);
//通过ConfigurationClassParser的doProcessConfigurationClass方法里的#214#行,扫描获取BeanDefinitionHolder集合
Set<BeanDefinitionHolder> scannedBeanDefinitions = this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
//通过ComponentScanAnnotationParser的parse方法里的#119#行,返回BeanDefinitionHolder集合
return scanner.doScan(StringUtils.toStringArray(basePackages));
//通过ClassPathBeanDefinitionScanner的doScan里的#113#行,扫描获取BeanDefinition集合
Set<BeanDefinition> candidates = this.findCandidateComponents(basePackage);
//底层通过ClassPathScanningCandidateComponentProvider的scanCandidateComponents方法里的#290#行,循环获取bean定义信息
ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);

2、实例化前@InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()

//查看AbstractApplicationContext的refresh()方法里的#297#行
this.finishBeanFactoryInitialization(beanFactory);
//查看AbstractApplicationContext的finishBeanFactoryInitialization方法里的#523#行
beanFactory.preInstantiateSingletons();
//查看DefaultListableBeanFactory的preInstantiateSingletons()方法里的#747#行
this.getBean(beanName);
//查看AbstractBeanFactory的doGetBean方法里的#207#行
return this.createBean(beanName, mbd, args);
//通过AbstractAutowireCapableBeanFactory的createBean方法里的#320#行,实现加载类
Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
//通过AbstractAutowireCapableBeanFactory的createBean方法里的#334#行,实现实例化前
beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
//通过AbstractAutowireCapableBeanFactory的resolveBeforeInstantiation方法里的#771#行,执行InstantiationAwareBeanPostProcessor实例化前
bean = this.applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
//@注意:当实例化前返回值不为null,则执行BeanPostProcessor实现类的初始化后
bean = this.applyBeanPostProcessorsAfterInitialization(bean, beanName);

3、实例化

//查看AbstractAutowireCapableBeanFactory的createBean方法里的#343#行
beanInstance = this.doCreateBean(beanName, mbdToUse, args);
//通过AbstractAutowireCapableBeanFactory的createBeanInstance方法里的#830#行,实现构造函数创建实例
this.autowireConstructor(beanName, mbd, ctors, args);
//通过AbstractAutowireCapableBeanFactory的doCreateBean方法里的#366#行,获取实例
Object bean = instanceWrapper.getWrappedInstance();

4、获取注入点@MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()

//查看AbstractAutowireCapableBeanFactory的createBean方法里的#343#行,实现实例化后操作
beanInstance = this.doCreateBean(beanName, mbdToUse, args);
//通过AbstractAutowireCapableBeanFactory的doCreateBean方法里的#376#行,查找注入点
this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
//通过AbstractAutowireCapableBeanFactory的applyMergedBeanDefinitionPostProcessors方法里的#759#行,通过MergedBeanDefinitionPostProcessor直接查找注入点
//InitDestroyAnnotationBeanPostProcessor实现类AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor
processor.postProcessMergedBeanDefinition(mbd, beanType, beanName);
//@例如:实现类AutowiredAnnotationBeanPostProcessor的postProcessMergedBeanDefinition方法里的124行,获取注入点InjectionMetadata
InjectionMetadata metadata = this.findAutowiringMetadata(beanName, beanType, (PropertyValues)null);
//AutowiredAnnotationBeanPostProcessor的findAutowiringMetadata方法里的#308#、#309#行具体实现如下
metadata = this.buildAutowiringMetadata(clazz);
this.injectionMetadataCache.put(cacheKey, metadata);

5、实例化后(执行实例化后置处理器,则跳过属性赋值逻辑,进入初始化逻辑)

@InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
//通过AbstractAutowireCapableBeanFactory的doCreateBean方法里的#399#行
this.populateBean(beanName, mbd, instanceWrapper);
//通过AbstractAutowireCapableBeanFactory的populateBean方法里的#928#行实现实例化后,返回值为false则返回,不执行剩下的属性注入逻辑
if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    return;
}
 

6、属性赋值

//通过AbstractAutowireCapableBeanFactory的doCreateBean方法里的#399#行
this.populateBean(beanName, mbd, instanceWrapper);
//当AutowireMode为ByName时,执行AbstractAutowireCapableBeanFactory的populateBean方法里的#939#行
this.autowireByName(beanName, mbd, bw, newPvs);
//具体通过AbstractAutowireCapableBeanFactory的autowireByName里的#998#行,把属性和对应的值放入MutablePropertyValues中
pvs.add(propertyName, bean);
//当AutowireMode为ByType时,执行AbstractAutowireCapableBeanFactory的populateBean方法里的#943#行
this.autowireByType(beanName, mbd, bw, newPvs);
//具体通过AbstractAutowireCapableBeanFactory的autowireByType里的#1032#行,把属性和对应的值放入MutablePropertyValues中
pvs.add(propertyName, autowiredArgument);
//1、byType,byName属性注入通过AbstractAutowireCapableBeanFactory的populateBean方法里的#983#行实现
this.applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
//2、@Autowire@Resource@Value注解注入,通过AbstractAutowireCapableBeanFactory的populateBean方法里的#960#行实现
pvsToUse = bp.postProcessProperties((PropertyValues)pvs, bw.getWrappedInstance(), beanName);
//2.1、@Autowire通过AutowiredAnnotationBeanPostProcessor的postProcessProperties方法里的268行实现
metadata.inject(bean, beanName, pvs);

7、回调Aware方法

//查看AbstractAutowireCapableBeanFactory的doCreateBean方法里的#400#行
exposedObject = this.initializeBean(beanName, exposedObject, mbd);
//通过AbstractAutowireCapableBeanFactory的initializeBean里的#1220#行
//实现BeanNameAware,BeanClassLoaderAware,BeanFactoryAware 等接口的aware方法回调
this.invokeAwareMethods(beanName, bean);

8、初始化前@BeanPostProcessor.postProcessBeforeInitialization()

  8.1、注意:@PostConstruct标注的方法就是在初始化前执行的,也就是CommonAnnotationBeanPostProcessor#postProcessBeforeInitialization

的父类的InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization方法

//查看AbstractAutowireCapableBeanFactory的initializeBean里的#1225#行
wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
//通过AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsBeforeInitialization方法里的#268#行,实现初始化前(BeanPostProcessor)
current = processor.postProcessBeforeInitialization(result, beanName);

9、初始化

  注意:

  9.1、InitializingBean#afterPropertiesSet就是在此时调用的

  9.2、MergedBeanDefinitionPostProcessor#.setInitMethodName("init888");init888方法就是此时被调用的

//查看AbstractAutowireCapableBeanFactory的initializeBean里的#1229#行
this.invokeInitMethods(beanName, wrappedBean, mbd);
//通过AbstractAutowireCapableBeanFactory的invokeInitMethods里的#1278#行,实现初始化
((InitializingBean)bean).afterPropertiesSet();
//当beandefinition的initMethodName方法不为空,则通过AbstractAutowireCapableBeanFactory的invokeInitMethods里的#1285#行,实现初始化
this.invokeCustomInitMethod(beanName, bean, mbd);

10、初始化后@BeanPostProcessor.postProcessAfterInitialization()

//查看AbstractAutowireCapableBeanFactory的initializeBean里的#1235#行
wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
//通过AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsAfterInitialization方法里的#283#行,实现初始化后(BeanPostProcessor)
current = processor.postProcessAfterInitialization(result, beanName);

 

 图片参考地址:https://blog.csdn.net/weixin_39024580/article/details/128813942

posted @ 2023-07-11 16:01  西风51668  阅读(70)  评论(0)    收藏  举报