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、实例化后(执行实例化后置处理器,则跳过属性赋值逻辑,进入初始化逻辑)
//通过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

浙公网安备 33010602011771号