spring-boot 依赖注入流程

news/2024/11/7 18:34:18/

一、基本使用

  • 主要是三个注解的使用,@Autowired,@Value,@Resource

二、实现步骤

  1. 拦截bean的创建
    要想拦截bean,就需要处理spring bean生命周期事件,spring通过一些接口来处理事件,实现属性注入,需要 InstantiationAwareBeanPostProcessor接口来完成。
  2. 找到注解的字段,并注入值
    获取被注解bean,然后从bean容器中中寻找响应类型的bean注入。

三、@Autowired,@Value是如何实现的

  1. 拦截bean的创建
    • AutowiredAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor接口
    • spring-boot 在启动的时候向容器中注入了AutowiredAnnotationBeanPostProcessor
调用
加载
构造方法中加载
构造方法中调用
向容器中添加
SpringApplication.run()
createApplicationContext()
AnnotationConfigServletWebServerApplicationContext.class
AnnotatedBeanDefinitionReader.class
AnnotationConfigUtils.registerAnnotationConfigProcessors()
AutowiredAnnotationBeanPostProcessor
  1. 找到注解的字段,并注入值
    • 通过AutowiredAnnotationBeanPostProcessor.postProcessProperties()和AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()两个方法完成
    • 每一个需要依赖注入的bean都被封装成了InjectionMetadata对象,每个要备注入的字段被封装成了AutowiredFieldElement对象
先调用
调用
调用
后调用
调用
调用
调用
调用
调用
调用
返回值
创建bean流程
AutowiredAnnotationBeanPostProcessor
.postProcessMergedBeanDefinition()
findAutowiringMetadata()
InjectionMetadata.checkConfigMembers()
AutowiredAnnotationBeanPostProcessor
.postProcessProperties()
findAutowiringMetadata()
InjectionMetadata.inject()
AutowiredFieldElement.inject()
DefaultListableBeanFactory.resolveDependency
DefaultListableBeanFactory.doResolveDependency
getAutowireCandidateResolver()
.getSuggestedValue(descriptor)
是否字符串
resolveEmbeddedValue()
处理@Value注解
findAutowireCandidates()
处理@Autowired注解

三、@Resource是如何实现的

  1. 拦截bean的创建
    • CommonAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor接口
    • spring-boot 在启动的时候向容器中注入了CommonAnnotationBeanPostProcessor
调用
加载
构造方法中加载
构造方法中调用
向容器中添加
SpringApplication.run()
createApplicationContext()
AnnotationConfigServletWebServerApplicationContext.class
AnnotatedBeanDefinitionReader.class
AnnotationConfigUtils.registerAnnotationConfigProcessors()
CommonAnnotationBeanPostProcessor
  1. 找到注解的字段,并注入值
    • CommonAnnotationBeanPostProcessor.postProcessProperties()和CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()两个方法完成
    • 每一个需要依赖注入的bean都被封装成了InjectionMetadata对象,每个要备注入的字段被封装成了ResourceElement对象
先调用
调用
调用
后调用
调用
调用
调用
调用
调用
调用
调用
创建bean流程
CommonAnnotationBeanPostProcessor
.postProcessMergedBeanDefinition()
findAutowiringMetadata()
InjectionMetadata.checkConfigMembers()
CommonAnnotationBeanPostProcessor
.postProcessProperties()
findAutowiringMetadata()
InjectionMetadata.inject()
ResourceElement.inject()
ResourceElement.getResourceToInject
CommonAnnotationBeanPostProcessor
.getResource
CommonAnnotationBeanPostProcessor
.autowireResource
DefaultListableBeanFactory.resolveBeanByName
返回要注入的对象

http://www.ppmy.cn/news/53139.html

相关文章

python flask快速入门的10个问题

工作中需要简单写一下web服务来做一些事情,了解到python的flask可以快速启动。梳理一下简单的问题。 1. Flask是什么? Flask是一个Python Web框架,用于快速构建网站和Web应用程序。它是轻量级的,非常易于学习和使用。 2. 如何安…

学习笔记:C语言简介

静态语言&#xff1a;c语言程序设计 c语言教程 C 语言是一种通用的、面向过程式的计算机程序设计语言。&#xff08;静态语言&#xff09; #include <stdio.h> int main() //主函数,表示程序的入口,一个程序有且只能有一个main函数 {/* 我的第一个 C 程序 */printf(&quo…

Let‘s Learn .NET|通过 Semantic Kernel .NET SDK 管理你的 OpenAI 项目

编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun Lets Learn .NET 系列 “Lets Learn .NET” 是面向全球的 .NET 初学者学习系列&#xff0c;旨在通过不同语言&#xff0c;帮助不同地区的开发者掌握最新的 .NET 开发知识与技能。 在 ChatGPT 与 OpenAI 火热的当下&#x…

自动驾驶方案及相关对标

华为:2021年4月18日,在华为智能汽车解决方案BU新品发布会上,华为智能汽车解决方案BU总裁王军表示,华为要持续加大对汽车行业的投入,今年在研发上的投资将达到10亿美元,未来每年保持30%左右增长,研发团队超过5000人,其中自动驾驶团队超过2000人。华为将发布五个新产品,…

MinIO服务部署,并实现开机自启动(优质文章)

MinIO是一个高性能、高可用性、分布式对象存储服务。本文将介绍如何在Linux系统上部署MinIO服务&#xff0c;并实现系统开机自启动。 环境准备 在开始部署之前&#xff0c;我们需要准备以下环境&#xff1a; 一台Linux服务器root权限的用户wget、tar等基本工具MinIO二进制包…

Python中的哈希表

哈希表是一种常用的数据结构&#xff0c;广泛应用于字典、散列表等场合。它能够在O(1)时间内进行查找、插入和删除操作&#xff0c;因此被广泛应用于各种算法和软件系统中。 哈希表的实现基于哈希函数&#xff0c;将给定的输入映射到一个固定大小的表格中&#xff0c;每个表项…

md/分类/信号领域/数字信号处理及MATLAB实现/频率调制(FM).md

文章目录 本文链接https://zh.wikipedia.org/wiki/频率调制用Python模拟FM/PM调制解调过程波形变化频率调制我的 本文链接 打死他 调频&#xff08;英语&#xff1a;Frequency Modulation&#xff0c;缩写&#xff1a;FM&#xff09;是一种以载波的瞬时频率变化来表示信息的方…

国产开源项目管理软件ZenTao

本文应网友 ukiyoec 要求而写&#xff1b; 什么是禅道 &#xff1f; 禅道 (ZenTao)是国产开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体&#xff0c;是一款专业的研发项目管理软件&#xff0c;完整覆盖了研发项目管理的核心流程。禅…