Bean创建流程
2024-03-23 21:33:35 1 举报
spring 创建Bean的主要流程
作者其他创作
大纲/内容
不是
标记正在创建
AbstractBeanFactory#getBean
如果Bean被代理过,则处理Bean的依赖
解析bean的名称transformedBeanName(name);
如果前面产生了Bean,则调用其他后置处理器BeanPostProcessor#postProcessAfterInitialization
是
通过各种判断选择创建Bean的方式
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference获取早起对象,只会出现在循环依赖中可能会是一个代理对象
从三级缓存获取
加入到一级缓存中,并从二三级缓存中移除
没有获取到
调用后置处理器InstantiationAwareBeanPostProcessor#postProcessPropertyValues后面版本会删掉
aop和事务都在这里生成代理对象BeanPostProcessor#postProcessAfterInitialization
DefaultSingletonBeanRegistry#getSingleton从一级缓存里面拿,拿不到就创建。创建完就放到一级缓存中
DisposableBeanAdapter获取Bean的销毁方法
有父工厂
InstantiationAwareBeanPostProcesso#postProcessBeforeInstantiation给后置处理器一个机会返回一个代理对象
DisposableBean#destroy如果实现了就调用
registerDisposableBeanIfNecessary注册销毁接口
允许
创建依赖的bean
populateBean属性赋值
DisposableBeanAdapter#invokeCustomDestroyMethod调用自定义的销毁方法
是否存在父工厂
createBean
尝试去缓存中获取对象getSingleton(beanName);
从正在创建集合中移除
后置处理器的第一次调用,Aop在这里解析切面并保存到缓存中
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition初始化Bean前最后可以修改Bean定义的地方
标记马上就要创建了,并校验是否出现循环依赖
DestructionAwareBeanPostProcessor#postProcessBeforeDestruction如果有则调用后置处理器@PreDestroy
调用singletonFactory.getObject()
createBeanInstance()实例化Bean
从二级缓存获取
是否是单例
递归调用getBean
BeanPostProcessor#postProcessBeforeInitialization@PostConstruct在此处处理
处理Aware接口BeanNameAware,BeanClassLoaderAware,BeanFactoryAware
是否允许创建早期对象默认允许
initializeBean对象初始化
是否在出创建
从一级缓存获取this.singletonObjects.get(beanName);
AbstractAutowireCapableBeanFactory#doCreateBeandoCreateBean真正创建
返回Bean
还没有获取到
把创建流程包装到ObjectFactory中
doGetBean
是否是FactoryBean
不为null
如果依赖的bean正在创建则抛出循环依赖异常
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation返回false则终止后续操作
有父工厂且当前工厂没有bean定义则使用父工厂创建
InitializingBean#afterPropertiesSet然后调用指定的initMethod
通过注入类型注入属性BY_NAME 或 BY_TYPE
getEarlyBeanReference获取早期引用
resolveBeforeInstantiation
抛出循环依赖异常
中期暴露对象添加到三级缓存中
0 条评论
回复 删除
下一页