Bean创建流程
2021-09-03 15:20:11 6 举报
Bean创建流程
作者其他创作
大纲/内容
不是
标记正在创建
getBean
如果Bean被代理过,则处理Bean的依赖
解析bean的名称transformedBeanName(name);
如果前面产生了Bean,则调用其他后置处理器
是
通过各种判断选择创建Bean的方式
调用后置处理器SmartInstantiationAwareBeanPostProcessor
从三级缓存获取
加入到一级缓存中,并从二三级缓存中移除
没有获取到
调用后置处理器InstantiationAwareBeanPostProcessor#postProcessPropertyValues
aop和事务都在这里生成代理对象BeanPostProcessor#postProcessAfterInitialization
有父工厂
调用实现InstantiationAwareBeanPostProcessor的接口
registerDisposableBeanIfNecessary注册销毁接口
允许
创建依赖的bean
populateBean属性赋值
后置处理器的第一次调用,Aop在这里解析切面并保存到缓存中
是否存在父工厂
createBean
尝试去缓存中获取对象getSingleton(beanName);
从正在创建集合中移除
AutowiredAnnotationBeanPostProcessor处理@AutoWired的注解
调用后置处理器MergedBeanDefinitionPostProcessor
标记马上就要创建了,并校验是否出现循环依赖
调用singletonFactory.getObject();
createBeanInstance()实例化Bean
从二级缓存获取
如果依赖的bean正在创建则抛出循环依赖异常
是否是单例
递归调用getBean
调用所有后置处理器postProcessBeforeInitialization方法,@PostConstruct在此处处理
处理Aware接口BeanNameAware,BeanClassLoaderAware,BeanFactoryAware
是否允许创建早期对象默认允许
initializeBean对象初始化
是否在出创建
从一级缓存获取this.singletonObjects.get(beanName);
doCreateBean真正创建
返回Bean
还没有获取到
把创建流程包装到ObjectFactory中
doGetBean
是否是FactoryBean
不为null
调用后置处理器InstantiationAwareBeanPostProcessor如果postProcessAfterInstantiation方法返回false则终止后续操作
有父工厂且当前工厂没有bean定义则使用父工厂创建
调用初始化方法,先调用InitializingBean#afterPropertiesSet后调用initMethod
通过注入类型注入属性
getEarlyBeanReference获取早期引用
抛出循环依赖异常
中期暴露对象添加到三级缓存中
0 条评论
下一页