Spring属性自动注入的基本流程

编程

下面是最普通的Bean注入流程 ,@AutoWire属性方式

  1. AnnotationConfigApplicationContext() 构造方法开始
  2. 在这个构造方法中调用 父类 AbstractApplicationContextrefresh()方法
  3. refresh()方法中调用 本类中的 finishBeanFactoryInitialization(ConfigurableListableBeanFactory)方法,这个方法的参数是在AnnotationConfigApplicationContext()对象初始化时 new 出来的
  4. finishBeanFactoryInitialization方法中调用 beanFactory.preInstantiateSingletons();
  5. preInstantiateSingletons 方法中会遍历它已经得到的所有beanDefinition的名字,beanDefinition的名字是在调用refresh()方法之前 扫描包路径中的类等到的,这里可以看spring的包扫描器ClassPathBeanDefinitionScanner
  6. 在遍历过程中会调用 getBean(String beanName)方法,比如我们需要两个bean (A/B),并且这两个bean 互相需要
  7. 如果我们在这次遍历过程中先 调用了 getBean(A)
  8. 先在容器中获取A(getSingleton(String)) ,如果没有获取到,而且这个没有被标记为 正在创建中,那么就会返回空
  9. 因为返回为空所以又调用了另一个getSingleton(String,ObjectFactory)重载方法,这个方法与上一个不同的是 如果窗口中没有这个bean : A 那么会通过ObjectFactory对象的getObject()方法创建一个,并且将 A 标记为正在创建中beforeSingletonCreation(beanName),而且还将构建A对象的方法保存在了一个map中(一个lambda表达式)
  10. 而这个getObject()方法中调用的createBean();

    11. createBean()方法中调用了doCreateBean();

  11. doCreateBean()方法中会构建一个A对象,这个对象类似通过new 的方式构建的(但其实中通过一个native方法构建的),将这个对象包装成BeanWrapper ;
  12. doCreateBean()方法构建一个BeanWrapper后会调用 populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) 方法,这个方法会那个A对象中注入他需要的属性B ,注入的具体方式是 通过 CommonAnnotationBeanPostProcessorAutowiredAnnotationBeanPostProcessor 对象的postProcessProperties方法进行注入
  13. 在注入过程中还会通过beanFactorgetBean(String) 方法来获取 B , 注意这里就已经进入了一个类似递归的循环了(循环到 第6步)
  14. getBean(B)的过程中 因为A与B循环依赖,所以又会调用 getBean(A) 的过程中,而跳出这个循环的条件在于第9步中 将 A这个bean 已经标记为正在创建中的状态,并且有了构建A对象的方法,这个时候getBean(A)就不为空了,这样就可以一步步退出循环

以上是 Spring属性自动注入的基本流程 的全部内容, 来源链接: utcz.com/z/517067.html

回到顶部