spring的AbstractAutowireCapableBeanFactory的doCreateBean的大致流程

整体大致流程是:
1.new出对象
2.解析@Autowired@Resource@PostConstuct注解
3.设置属性
4.执行BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口实现方法
5.执行BeanPostProcessor的postProcessBeforeInitialization方法(执行@PostConstruct标注的方法)
6.执行InitializingBean接口实现类的afterPropertiesSet
7.执行自定义的init方法
8.执行BeanPostProcessor的applyBeanPostProcessorsAfterInitialization方法
9.解决循环依赖

具体流程梳理:

  • 1.创建bean对象
  • 2.调用MergedBeanDefinitionPostProcessors的实现类CommonAnnotationBeanPostProcessor的postProcessMergedBeanDefinition实现方法解析@PostContruct、@PreDestroy、@WebServiceRef、@Resource、注解
  • 3.调用MergedBeanDefinitionPostProcessors的实现类AutowiredAnnotationBeanPostProcessor的的postProcessMergedBeanDefinition实现方法解析@Autowired注解
  • 4.调用InstantiationAwareBeanPostProcessor的实现类的postProcessAfterInstantiation方法,确定某些类的是否要忽略属性的注入
  • 5.调用InstantiationAwareBeanPostProcessor的实现类ImportAwareBeanPostProcessor(ConfigurationClassPostProcessor的内部类)的postProcessProperties方法为@Configuration标注的类生成的cglib的bean注入beanFactory
  • 6.调用InstantiationAwareBeanPostProcessor的实现类CommonAnnotationBeanPostProcessor的postProcessProperties方法注入@Resource标注的属性值
  • 7.调用InstantiationAwareBeanPostProcessor的实现类AutowiredAnnotationBeanPostProcessor的postProcessProperties的方法设置@Autowired标注的属性的值
  • 8.执行BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
  • 9.执行所有的BeanPostProcessor的postProcessBeforeInitialization方法,比如ApplicationContextAwareProcessor处理ApplicationContextAware的接口实现类的注入、CommonAnnotationBeanPostProcessor处理执行@PostContruct注解标注的方法
  • 10.执行InitializingBean接口实现类的afterPropertiesSet
  • 11.执行自定义的init方法
  • 12.执行BeanPostProcessor的applyBeanPostProcessorsAfterInitialization方法
  • 13.解决循环依赖问题
1.创建bean对象

在这里插入图片描述

2. 执行MergedBeanDefinitionPostProcessors,解析相关注解

在这里插入图片描述
在这里插入图片描述

  1. 执行CommonAnnotationBeanPostProcessor(这个BeanPostProcessor会解析@PostConstruct、@PreDestroy、@Resource)的postProcessMergedBeanDefinition方法,方法里面调用findLifecycleMetadata解析@PostConstruct注解,然后解析@PreDestroy注解;调用findResourceMetadata解析field、method上的@WebServiceRef、@Resource注解,String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());InjectionMetadata metadata = buildResourceMetadata(clazz);this.injectionMetadataCache.put(cacheKey, metadata)将生成的InjectionMetadata的缓存;调用InjectionMetadata的checkConfigMembers方法,找到@Resource注入的属性关联的是哪个类型的bean
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. 执行AutowiredAnnotationBeanPostProcessor(这个BeanPostProcessor会解析@Autowired、@Value、@Inject、@Lookup注解,这里只解析@Autowired注解)的postProcessMergedBeanDefinition方法,方法里面调用findAutowiringMetadata方法解析field、method上的@Autowired注解,String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());InjectionMetadata metadata = buildResourceMetadata(clazz);this.injectionMetadataCache.put(cacheKey, metadata)将生成的InjectionMetadata的缓存;调用InjectionMetadata的checkConfigMembers方法,找到@Autowired注入的属性关联的是哪个类型的bean(这里的injectionMetadataCache跟CommonAnnotationBeanPostProcessor的injectionMetadataCache是两个不同的)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 执行ApplicationListenerDetector的postProcessMergedBeanDefinition方法
    在这里插入图片描述
    在这里插入图片描述

3.将创建的还未经历完整生命周期的bean缓存为了解决可能存在的循环依赖问题

在这里插入图片描述
在这里插入图片描述

4.populateBean(beanName, mbd, instanceWrapper);填充属性

在这里插入图片描述

  1. 执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法,是否跳过某些bean的属性注入,一般返回的true不跳过
    在这里插入图片描述
    在这里插入图片描述
  2. 执行InstantiationAwareBeanPostProcessor的postProcessProperties方法
    在这里插入图片描述
    1. 执行ConfigurationClassPostProcessor的内部类ImportAwareBeanPostProcessor的postProcessProperties方法,如果当前bean是@Configuration标注的类对应生成的cglib代理类,那么就为该bean注入beanFactory
      在这里插入图片描述
    2. 执行CommonAnnotationBeanPostProcessor的postProcessProperties的方法,方法里面调用findResourceMetadata方法,先去上一步解析好的injectionMetadataCache中根据beanName获取解析好的@Resourse信息,如果没有就解析field、method上的@WebServiceRef注解、@Resource注解然后放入injectionMetadataCache中。调用InjectMetadata的inject方法,给@Resource标注的属性赋值,如果当前需要的值是未创建的bean那么就调用CommonAnnotationBeanPostProcessor的内部类ResourceElement的getResourceToInject方法进而去创建该bean,然后再赋值
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述
    3. 执行AutowiredAnnotationBeanPostProcessor的postProcessProperties的方法设置@Autowired标注的属性的值,步骤与@Resource的类似
6.initializeBean(beanName, exposedObject, mbd)初始化bean
  1. 执行invokeAwareMethods,如果当前bean实现了BeanNameAware接口,调用当前类的setBeanName方法;如果当前bean实现类BeanClassLoaderAware接口,调用当前bean的setBeanClassLoader方法;如果当前类实现了BeanFactoryAware接口,调用当前bean的setBeanFactory方法
    在这里插入图片描述
  2. 执行所有的BeanPostProcessor的postProcessBeforeInitialization方法
    1. 执行BeanPostProcessor的实现类ApplicationContextAwareProcessor的postProcessBeforeInitialization方法,在里面回调Aware接口的setXxx方法。依次判断当前bean是否实现EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware接口,实现了的话就调用实现的setXxx方法
      在这里插入图片描述
      在这里插入图片描述
    2. 执行WebApplicationContextServletContextAwareProcessor的父类ServletContextAwareProcessor的postProcessBeforeInitialization方法,判断当前bean是否实现了ServletContextAware、ServletConfigAware接口,实现了的话就调用当前bean实现的setXxx方法
      在这里插入图片描述
    3. 执行ConfigurationClassPostProcessor的内部类ImportAwareBeanPostProcessor的postProcessBeforeInitialization方法,里面会判断当前bean是否实现了ImportAware,如果实现了就调用实现的setImportMetadata方法拿到当前bean所在的那个@Import那个注解里面所贴的那个类上所有的注解信息(ImportAware接口都是配合@Import接口使用的)。
      在这里插入图片描述
      例子:在这里插入图片描述在这里插入图片描述
    4. 执行PostProcessorRegistrationDelegate的内部类BeanPostProcessorChecker的postProcessBeforeInitialization方法,里面其实没做啥
      在这里插入图片描述
    5. 执行ConfigurationPropertiesBindingPostProcessor的postProcessBeforeInitialization方法,解析@ConfigurationProperties注解注入值
      在这里插入图片描述
      在这里插入图片描述
      例子:
      在这里插入图片描述
    6. 执行MethodValidationPostProcessor的postProcessBeforeInitialization方法
      在这里插入图片描述
    7. 执行WebServerFactoryCustomizerBeanPostProcessor的postProcessBeforeInitialization方法
      在这里插入图片描述
      在这里插入图片描述
    8. 执行ErrorPageRegistrarBeanPostProcessor的postProcessBeforeInitialization方法
      在这里插入图片描述
      在这里插入图片描述
    9. 执行CommonAnnotationBeanPostProcessor的父类InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInitialization方法,里面调用了InitDestroyAnnotationBeanPostProcessor的内部类LifecycleMetadata的invokeInitMethods方法,invokeInitMethods里面调用了内部类LifecycleElement的invoke方法。invoke里面利用反射调用了@PostConstruct标注的方法
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述
    10. 调用AutowiredAnnotationBeanPostProcessor的父类InstantiationAwareBeanPostProcessorAdapter的postProcessBeforeInitialization方法,没做啥
      在这里插入图片描述
      在这里插入图片描述
    11. 调用ApplicationListenerDetector的postProcessBeforeInitialization方法
      在这里插入图片描述
      在这里插入图片描述
  3. invokeInitMethods(beanName, wrappedBean, mbd),先判断当前bean是否实现了InitializingBean接口,若当前bean实现了InitializingBean接口,那么执行实现的afterPropertiesSet方法;再执行当前bean自定义的init方法。这里执行自定义方法的时候还会先判断自定义的那个init方法是否是上面InitializingBean的实现方法,如果是的话就不执行,避免执行两次
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);调用BeanPostProcessor的postProcessAfterInstantiation方法
    1. 执行ApplicationContexAwareProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
    2. 执行WebApplicationContextServletContextAwareProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
    3. 执行ConfigurationClassPostProcessor的内部类ImportAwareBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
    4. 执行PostProcessorRegistrationDelegate的postProcessAfterInitialization方法
      在这里插入图片描述
    5. 执行ConfigurationPropertiesBindingPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
    6. 执行MethodValidationPostProcessor的postProcessAfterInitialization方法,这个方法暂时是什么场景使用的还不知道
      在这里插入图片描述
      在这里插入图片描述
    7. 执行WebServerFactoryCustomizerBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
    8. 执行ErrorPageRegistrarBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
    9. 执行CommonAnnotationBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
    10. 执行AutowiredAnnotationBeanPostProcessor的postProcessAfterInitialization方法,这里直接返回bean没做啥别的操作
    11. 执行ApplicationListenerDetector的postProcessAfterInitialization方法,如果当前bean是ApplicationListener接口实现类,那么将当前bean添加到spring的listener容器中
      在这里插入图片描述
7.解决循环依赖问题

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值