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)就不为空了,这样就可以一步步退出循环
优秀的个人博客,低调大师

微信关注我们

原文链接:https://my.oschina.net/Mzoro/blog/4298908

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。