SpringBoot2.3之Bean的一生

本文详细解释了Spring框架中如何通过`SpringApplication`初始化上下文,包括Bean的工厂创建、后置处理器的执行、依赖注入、单例和非单例bean的实例化,以及生命周期中的各种扩展点和销毁操作。
摘要由CSDN通过智能技术生成

出生

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();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值