基于Springboot2.4.5版本
SpringApplication#run(java.lang.Class<?>, java.lang.String...)
SpringApplication#run(java.lang.Class<?>[], java.lang.String[])
-
SpringApplication#run(java.lang.String...)
- refreshContext(context);
SpringApplication#refreshContext
-
SpringApplication#refresh(ConfigurableApplicationContext applicationContext)
- applicationContext.refresh();//此处的applicationContext实现类是ServletWebServerApplicationContext
ServletWebServerApplicationContext#refresh
-
AbstractApplicationContext#refresh
- finishBeanFactoryInitialization(beanFactory);
-
AbstractApplicationContext#finishBeanFactoryInitialization
- beanFactory.preInstantiateSingletons();//此处的beanFactory是DefaultListableBeanFactory
-
DefaultListableBeanFactory#preInstantiateSingletons
- 遍历beanNames,逐个getBean
- getBean(beanName);
AbstractBeanFactory#getBean(java.lang.String)
-
AbstractBeanFactory#doGetBean
- Object sharedInstance = getSingleton(beanName);
- DefaultSingletonBeanRegistry#getSingleton(java.lang.String, ObjectFactory<?>)// 带bean的采购者创建bean
- beforeSingletonCreation(beanName);//标记bean创建中
- singletonObject = singletonFactory.getObject();
- AbstractBeanFactory#createBean
- AbstractAutowireCapableBeanFactory#createBean
-
AbstractAutowireCapableBeanFactory#doCreateBean // 真正的bean的创建方法
- instanceWrapper = createBeanInstance(beanName, mbd, args);//构造器创建bean
- addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
- populateBean(beanName, mbd, instanceWrapper);//填充属性
- org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessProperties//遍历所有属性并填充
- exposedObject = initializeBean(beanName, exposedObject, mbd);
- invokeAwareMethods(beanName, bean);
- wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//bean的前置处理
- BeanPostProcessor注册是CommonAnnotationBeanPostProcessor,调用的是它的父类InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization//执行注解@PostConstruct
- invokeInitMethods(beanName, wrappedBean, mbd);//初始化bean
- ((InitializingBean) bean).afterPropertiesSet();//对应接口InitializingBean
- invokeCustomInitMethod(beanName, bean, mbd);//对应注解@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
- wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);// bean的后置处理
- BeanPostProcessor#postProcessAfterInitialization//找到所有的bean后置处理器包装bean,比如这个AbstractAutoProxyCreator#postProcessAfterInitialization的AbstractAutoProxyCreator#wrapIfNecessary会触发动态代理,把之前通过构造器创建的类,替换成动态代理创建的代理对象
- ProxyFactory#getProxy(java.lang.ClassLoader)
- createAopProxy().getProxy(classLoader);
- createAopProxy():DefaultAopProxyFactory#createAopProxy//创建动态代理类
- .getProxy(classLoader):CglibAopProxy#getProxy(java.lang.ClassLoader)
- afterSingletonCreation(beanName);//清除bean创建中的标记
- addSingleton(beanName, singletonObject);//加入单例池DefaultSingletonBeanRegistry.singletonObjects
- beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
- adaptBeanInstance(name, beanInstance, requiredType)