Bean的创建过程:
DefaultListableBeanFactory->AbstractBeanFactory->AbstractAutowireCapableBeanFactory
DefaultListableBeanFactory:执行创建bean前的准备操作,如:将factory注册表所有的BeanDefination转化为RootBeanDefination
AbstractBeanFactory:执行doGetBean操作,
AbstractAutowireCapableBeanFactory:创建bean的核心类,执行bean的初始化和实例化
bean创建过程:
1.遍历操作beanDefinitionNames,首先将所有的BeanDefination转化为RootBeanDefination
2.判断RootBeanDefinition非抽象、单例、非懒惰加载,如果满足则调用doGetBean创建该bean
3.尝试从单例表中获取bean实例(这里面涉及从不同缓存中取数),因为spring依赖注入的特性,一些bean可能会在创建其他bean时被动创建
4.如果获取到,则返回;
5.如果没获取到且在beanDefinitionMap中不存在该beanName,则尝试从parentBeanFactory中获取该bean,获取到则返回,否则继续往下走
6.对该RootBeanDefinition的依赖bean进行处理,首先使用递归判断彼此之间是否存在循环依赖,如果存在抛出异常,如果没有则创建依赖的bean
7.创建该bean实例,这里会就走到AbstractAutowireCapableBeanFactory核心类了,这里详细写下该步骤
1.执行实例化前操作,尤其是实现了InstantiationAwareBeanPostProcessor接口的实现类,可以自己实例化bean
2.spring实例化bean
3.实例化之后将单例名称缓存起,用于解决循环引用
4.给bean填充属性值
5.spring初始化bean:
->执行BeanPostProcessor-postProcessBeforeInitialization
->执行InitializingBean->afterPropertiesSet
->执行initMethod
->执行BeanPostProcessor-postProcessAfterInitialization
问题思考:
问题1.怎么解决循环依赖的问题?
在创建bean的过程中实例化完bean后会将名称缓存起,用于解决循环引用,具体如何解决循环引用,看了:
https://blog.csdn.net/u010853261/article/details/77940767 这篇文章写得很不错。
继续阅读与本文标签相同的文章
C++ Opencv——色形纹分类检测综合
目标检测的渐进域自适应,优于最新SOTA方法
-
如何检测 Web 服务请求丢失问题
2026-05-18栏目: 教程
-
基于阿里云服务器ECS的建站过程
2026-05-18栏目: 教程
-
8分钟5个点让你彻底了解负载均衡
2026-05-18栏目: 教程
-
2019年9月16日,开发者社区奖励办法--8月评选结果正式公布
2026-05-18栏目: 教程
-
RocketMQ 主题扩分片后遇到的坑
2026-05-18栏目: 教程
