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)就不为空了,这样就可以一步步退出循环

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
混合云备份服务欠费说明你需要知道什么
云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 本文介绍在什么情况下使用混合云备份服务HBR(Hybrid Backup Recovery) 会产生欠费,以及欠费之后的服务状态。 当您的 HBR 服务处于以下情况时,可能会产生欠费: 您已购买资源包,但您的使用量超出资源包额度,而您绑定的账户余额不足。 您没有购买资源包,且您绑定的账户余额不足。 如果您的 HBR 服务产生欠费,请注意以下事项: VMware虚机迁移 欠费1小时内,VMware虚机迁移仍可以正常复制上云;欠费1小时后,VMware虚机迁移任务失败,需要在续费后重新启动迁移。已经完成迁移的ECS欠费行为跟常见的ECS一致。 本文来自 阿里云文档中心 混合云备份服务 欠费说明 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
-
下一篇
Springboot 系列(四)Spring Boot 日志框架
文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。 欢迎关注我的公众号,文章每周更新。、 注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别。 前言 Spring 框架选择使用了 JCL 作为默认日志输出。而 Spring Boot 默认选择了 SLF4J 结合 LogBack。那我们在项目中该使用哪种日志框架呢?在对于不同的第三方 jar 使用了不同的日志框架的时候,我们该怎么处理呢? <!-- more --> 1. 日志框架介绍 日志对于应用程序的重要性不言而喻,不管是记录运行情况还是追踪线上问题,都离不开对日志的分析,在 Java 领域里存在着多种日志框架,如 JUL, Log4j, Log4j2, Commons Loggin, Slf4j, Logback 等。关于 Log4j, Log4j2 和 Slf4j 直接的故事这里不做介绍,有兴趣可以自行百度。 2. SLF4 的使用 在...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块