出生
SpringApplication#refreshContext
工厂
DefaultListableBeanFactory(BeanDefinitionRegistry)
工厂后置处理器
BeanFactoryPostProcessors(ConfigurationClassPostProcessor)
将含有注解的类,注册到DefaultListableBeanFactory工厂中的BeanDefinitionMap
Class->BeanDefinition
Bean后置处理器
BeanPostProcessors
初始化单例(Bean实例)
ServletWebServerApplicationContext#finishBeanFactoryInitialization
实例化根bean
预实例化所有单例,遍历所有beanDefinitionNames
含有扩展点:SmartInitializingSingleton
DefaultListableBeanFactory.preInstantiateSingletons();
获取合并的db
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
获取bean
getBean(beanName)
创建bean
createBean(beanName, mbd, args)
创建bean
doCreateBean(beanName, mbdToUse, args)
填充根bean属性
填充bean,遍历执行BeanPostProcessors(CommonAnnotationBeanPostProcessor)
populateBean(beanName, mbd, instanceWrapper)填充bean
后置处理对象的属性
ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName)
依赖注入
element.inject(target, beanName, pvs)
依赖的bean字段设置
field.set(target, getResourceToInject(target, requestingBeanName));
根据beanName创建bean对象
beanFactory.resolveBeanByName(name, descriptor)
实例化依赖的bean
获取bean
getBean(name, descriptor.getDependencyType());
创建bean
doGetBean(name, requiredType, null, false);
创建bean实例
sharedInstance = getSingleton(beanName, ()->createBean(beanName, mbd, args));
创建bean
createBean(beanName, mbd, args);
创建bean
doCreateBean(beanName, mbdToUse, args);
创建bean实例包装
instanceWrapper = createBeanInstance(beanName, mbd, args);
实例化bean
return instantiateBean(beanName, mbd);
实例化bean
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
通过构造方法反射实例化java对象
BeanUtils.instantiateClass(constructorToUse);
获取java对象
final Object bean = instanceWrapper.getWrappedInstance();
初始化依赖的bean实例
暴露的对象
Object exposedObject = bean;
填充属性
populateBean(beanName, mbd, instanceWrapper)
初始化bean
exposedObject = initializeBean(beanName, exposedObject, mbd);
调用感知方法
扩展点:aware:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
invokeAwareMethods
执行Bean后置处理的before方法
Object current = processor.postProcessBeforeInitialization(result, beanName);
调用初始化InitializingBean和方法
扩展点:InitializingBean
invokeInitMethods(beanName, wrappedBean, mbd);
执行Bean后置处理的after方法
Object current = processor.postProcessAfterInitialization(result, beanName);
将根bean和依赖的bean先后添加到工厂
将单例bean添加到工厂中
addSingleton(beanName, singletonObject);
addSingleton(beanName, singletonObject);
扩展点
SmartInitializingSingleton
InitializingBean
DisposableBean
Aware
工作
URL->Tomcat->Filter->Servlet->Interceptor->ControllerAdvice->Controller
死亡
注册关机钩
SpringApplication#registerShutdownHook();
Runtime.getRuntime().addShutdownHook(this.shutdownHook);
关闭操作
doClose();
发布关闭事件
publishEvent(new ContextClosedEvent(this));
销毁bean
destroyBeans();
从工厂中移除单例
removeSingleton(beanName);
执行bean的销毁方法
扩展点:DisposableBean
destroyBean(beanName, disposableBean);
关闭工厂
closeBeanFactory();