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

