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 这篇文章写得很不错。

收藏 打印