本文主要讲解Spring生命周期中实例化后的方法。方法入口为populateBean(beanName, mbd, instanceWrapper),该方法除了调用InstantiationAwareBeanPostProcessor接口的postProcessAfterInstantiation方法(实例化后扩展接口),还会进行属性的依赖注入,即给Bean中符合要求的字段进行属性填充。

文章目录

  • 一、DI整体流程图
  • 二、需明白知识点
  • 三、待补充知识点

一、DI整体流程图

我将具体的依赖注入步骤整理为如下的流程图:
不同版本的Spring该部分代码有些许差异,但整体思路差不多,我的版本是Spring5.0.x

网页端是能够清晰且方便展示的,手机端可以保存后图库查看

自认为该流程图包含了70%以上的依赖注入的内容,如果你正在阅读依赖注入部分源码,可以参考上面的流程


二、需明白知识点

我相信你在跟完依赖注入的源代码后,你将要能够明白以下问题:

  1. @Autwired和@Resource在注入Bean时的name和type优先级区别
  2. @Autwired注解在解析方法或者成员变量的解析详细流程(三个CandidateResolver类、两个注解、一个byName)
  3. 参数和方法是static类型时能否被注入
  4. @Bean中配置AutworedMode类型为name或type后和默认情况什么区别
  5. 当我们在成员变量和set方法上(成员变量对应的set方法)都是用了@Autwired注解后,两个@Autwired的注入顺序是什么
  6. @Value注解解析的具体规则
  7. 如果我们自定义了对应的属性注入参数(代码如下),代码中对应的逻辑判断在什么位置。提示:如果我们自定义了相关Bean的属性注入内容,那么在注解解析的时候,会跳过我们定义过的属性。
// 如果bean的名字是teacher,那么久给teacher对象的name字段赋值为mobian
@Component
public class MergedBeanPostProcess implements MergedBeanDefinitionPostProcessor {@Overridepublic void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {if(beanName.equals("teacher")){beanDefinition.setInitMethodName("a");beanDefinition.getPropertyValues().add("name","mobian");}}
}

三、待补充知识点

图中还有几个重要知识点没有详细展开,需要你自行研究。

1、注入的Bean存入缓存部分

当我们给对应的方法或者是成员变量属性注入成功后,会将该Bean

构建一个ShortcutDependencyDescriptor类的对象作为缓存,保存了当前成员变量或者方法所匹配的autowiredBeanName,后期如果不同Bean对象使用到了同一个注入的Bean,就可以直接去缓存中,根据beanName直接去单例池中获取

2、注入的类型是FactoryBean类型

当我们的注入类型是FactoryBean的时候,它会在逻辑校验中调用到对应的getObjectType。我们之前使用实现FactoryBean接口的方式定义Bean,都需要重写getObject和getObjectType方法,前者在我们获取Bean的时候会被调用,后者在此处我们去获取Bean的类型的时候就会使用到,这里我们可以不需要去实例化对象就能获取到该Bean的类型

3、对于属性描述器部分

对于一个标准的pojo类,都是一个成员变量,然后配置上对应的get、set方法。每一个成员变量都可以映射为一个PropertyDescriptor类的对象,该类包含对应成员变量的名字、set方法、get方法…这个属性描述器贯穿了整个依赖注入的源码。

Spring依赖注入流程【完整版】(populateBean方法内部执行流程)相关推荐

  1. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件...

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  2. Spring依赖注入和循环依赖问题分析

    Spring源码揭秘之依赖注入和循环依赖问题分析 前言 依赖注入的入口方法 依赖注入流程分析 AbstractBeanFactory#getBean AbstractBeanFactory#doGet ...

  3. arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  4. spring依赖注入_Spring源码阅读:Spring依赖注入容器

    依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...

  5. Spring 依赖注入的理解及三种注入方式

    Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...

  6. 【spring源码系列-05】refresh中prepareRefresh方法的执行流程

    Spring源码系列整体栏目 内容 链接地址 [一]spring源码整体概述 https://blog.csdn.net/zhenghuishengq/article/details/13094088 ...

  7. Java程序员进阶——Spring依赖注入原理分析

    Spring依赖注入原理分析 下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI: 平时,我们需要生成一个对象,使用new语法,如一个类为A public class A{public v ...

  8. spring 依赖注入

    Technorati 标记: spring,依赖注入,DI,ioc 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的 ...

  9. spring依赖注入原理(转载)

    关于spring依赖注入原理的文章在网络上已经有很多,我要写的这篇文章原文出自http://taeky.iteye.com/blog/563450,只所以再一次写下来只是为了一为自己收藏,方便以后的复 ...

  10. Spring依赖注入:注解注入总结

    更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.C ...

最新文章

  1. HashSet的使用
  2. 【FPGA】ODDR使用研究记录
  3. python 实现双端队列
  4. Java自学!Java项目面试介绍
  5. 转:如何进行软件架构设计?
  6. yum安装k8s集群(单master两个node、阿里云镜像源)
  7. 沃舍尔算法_[数据结构拾遗]图的最短路径算法
  8. 基于css3的鼠标滑动按钮动画之CSS--续
  9. linux c 调用python_C程序调用Python脚本
  10. html基本语法(实例)
  11. 2016年度最受欢迎中国开源软件评选
  12. python logging详解及自动添加上下文信息
  13. 如何防止 Safari 使用来自 iOS 15 和 macOS Monterey 的网站着色?
  14. hbase shell 入门
  15. 纽微特反省:别人犯错不敢说,那是因为自己不干活
  16. ubuntu下载python3.8_ubuntu16.04纯净版-安装Python3.8.1/升级pip
  17. jvm 调优 2020.09.07
  18. 中央处理器(CPU)—— CPU的功能和基本结构
  19. 减一技术实现求a的n次幂
  20. 关于QQBot机器人掉线问题修复

热门文章

  1. Luogu4113 [HEOI2012]采花
  2. [2018.10.23 T1] 战争
  3. BZOJ5216 [Lydsy2017省队十连测]公路建设
  4. useradd/adduser 添加用户
  5. win7一直显示正在关机_当办公场所没有WIFI,有网线,笔记本如何在 win7建立无线网络...
  6. 前端调试debugf_前端应该掌握的这些Debug技巧,能够快速提升你的前端开发能力...
  7. anaconda moviepy_Anaconda使用之安装篇(Windows)
  8. HBase在新能源汽车监控系统中的应用
  9. import radom 和import string
  10. 【Codeforces 1114C】Trailing Loves (or L'oeufs?)