Springboot Bean的创建过程

基于Springboot2.4.5版本

  1. SpringApplication#run(java.lang.Class<?>, java.lang.String...)

  2. SpringApplication#run(java.lang.Class<?>[], java.lang.String[])

  3. SpringApplication#run(java.lang.String...)

    1. refreshContext(context);
  4. SpringApplication#refreshContext

  5. SpringApplication#refresh(ConfigurableApplicationContext applicationContext)

    1. applicationContext.refresh();//此处的applicationContext实现类是ServletWebServerApplicationContext
  6. ServletWebServerApplicationContext#refresh

  7. AbstractApplicationContext#refresh

    1. finishBeanFactoryInitialization(beanFactory);
  8. AbstractApplicationContext#finishBeanFactoryInitialization

    1. beanFactory.preInstantiateSingletons();//此处的beanFactory是DefaultListableBeanFactory
  9. DefaultListableBeanFactory#preInstantiateSingletons

    1. 遍历beanNames,逐个getBean
    2. getBean(beanName);
  10. AbstractBeanFactory#getBean(java.lang.String)

  11. AbstractBeanFactory#doGetBean

    1. Object sharedInstance = getSingleton(beanName);
    2. DefaultSingletonBeanRegistry#getSingleton(java.lang.String, ObjectFactory<?>)// 带bean的采购者创建bean
      1. beforeSingletonCreation(beanName);//标记bean创建中
      2. singletonObject = singletonFactory.getObject();
        1. AbstractBeanFactory#createBean
        2. AbstractAutowireCapableBeanFactory#createBean
        3. AbstractAutowireCapableBeanFactory#doCreateBean // 真正的bean的创建方法
          1. instanceWrapper = createBeanInstance(beanName, mbd, args);//构造器创建bean
          2. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
          3. populateBean(beanName, mbd, instanceWrapper);//填充属性
            1. org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessProperties//遍历所有属性并填充
          4. exposedObject = initializeBean(beanName, exposedObject, mbd);
            1. invokeAwareMethods(beanName, bean);
            2. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//bean的前置处理
              1. BeanPostProcessor注册是CommonAnnotationBeanPostProcessor,调用的是它的父类InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization//执行注解@PostConstruct
            3. invokeInitMethods(beanName, wrappedBean, mbd);//初始化bean
              1. ((InitializingBean) bean).afterPropertiesSet();//对应接口InitializingBean
              2. invokeCustomInitMethod(beanName, bean, mbd);//对应注解@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
            4. wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);// bean的后置处理
              1. BeanPostProcessor#postProcessAfterInitialization//找到所有的bean后置处理器包装bean,比如这个AbstractAutoProxyCreator#postProcessAfterInitialization的AbstractAutoProxyCreator#wrapIfNecessary会触发动态代理,把之前通过构造器创建的类,替换成动态代理创建的代理对象
              2. ProxyFactory#getProxy(java.lang.ClassLoader)
                1. createAopProxy().getProxy(classLoader);
                2. createAopProxy():DefaultAopProxyFactory#createAopProxy//创建动态代理类
                3. .getProxy(classLoader):CglibAopProxy#getProxy(java.lang.ClassLoader)
      3. afterSingletonCreation(beanName);//清除bean创建中的标记
      4. addSingleton(beanName, singletonObject);//加入单例池DefaultSingletonBeanRegistry.singletonObjects
    3. beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    4. adaptBeanInstance(name, beanInstance, requiredType)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容