Spring属性自动注入的基本流程
下面是最普通的Bean注入流程 ,@AutoWire属性方式
- 从
AnnotationConfigApplicationContext()
构造方法开始 - 在这个构造方法中调用 父类
AbstractApplicationContext
的refresh()
方法 refresh()
方法中调用 本类中的finishBeanFactoryInitialization(ConfigurableListableBeanFactory)
方法,这个方法的参数是在AnnotationConfigApplicationContext()
对象初始化时 new 出来的finishBeanFactoryInitialization
方法中调用beanFactory.preInstantiateSingletons()
;preInstantiateSingletons
方法中会遍历它已经得到的所有beanDefinition
的名字,beanDefinition
的名字是在调用refresh()
方法之前 扫描包路径中的类等到的,这里可以看spring的包扫描器ClassPathBeanDefinitionScanner
- 在遍历过程中会调用
getBean(String beanName)
方法,比如我们需要两个bean (A/B)
,并且这两个bean 互相需要 - 如果我们在这次遍历过程中先 调用了
getBean(A)
- 先在容器中获取A(
getSingleton(String)
) ,如果没有获取到,而且这个没有被标记为 正在创建中,那么就会返回空 - 因为返回为空所以又调用了另一个
getSingleton(String,ObjectFactory)
重载方法,这个方法与上一个不同的是 如果窗口中没有这个bean : A
那么会通过ObjectFactory
对象的getObject()
方法创建一个,并且将 A 标记为正在创建中beforeSingletonCreation(beanName)
,而且还将构建A对象的方法保存在了一个map中(一个lambda表达式) - 而这个
getObject()
方法中调用的createBean()
;11.
createBean()
方法中调用了doCreateBean()
; doCreateBean()
方法中会构建一个A对象,这个对象类似通过new 的方式构建的(但其实中通过一个native方法构建的),将这个对象包装成BeanWrapper ;- doCreateBean()方法构建一个
BeanWrapper后会调用 populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw)
方法,这个方法会那个A对象中注入他需要的属性B ,注入的具体方式是 通过CommonAnnotationBeanPostProcessor
或AutowiredAnnotationBeanPostProcessor
对象的postProcessProperties方法进行注入 - 在注入过程中还会通过
beanFactor
的getBean(String)
方法来获取 B , 注意这里就已经进入了一个类似递归的循环了(循环到 第6步) - 在
getBean(B)
的过程中 因为A与B循环依赖,所以又会调用getBean(A)
的过程中,而跳出这个循环的条件在于第9步中 将 A这个bean 已经标记为正在创建中的状态,并且有了构建A对象的方法,这个时候getBean(A)就不为空了,这样就可以一步步退出循环
以上是 Spring属性自动注入的基本流程 的全部内容, 来源链接: utcz.com/z/517067.html