6、Spring之依赖注入源码解析(上)

news2025/1/24 5:32:05

依赖注入底层原理流程图:

Spring中Bean的依赖注入原理| ProcessOn免费在线作图,在线流程图,在线思维导图

Spring中到底有几种依赖注入的方式?

首先分两种:

  1. 手动注入
  2. 自动注入

手动注入

在XML中定义Bean时,就是手动注入,因为是程序员手动给某个属性指定了值

<bean name="userService" class="com.luban.service.UserService">
	<property name="orderService" ref="orderService"/>
</bean>

上面这种底层是通过set方法进行注入。

<bean name="userService" class="com.luban.service.UserService">
	<constructor-arg index="0" ref="orderService"/>
</bean>

上面这种底层是通过构造方法进行注入。

所以手动注入的底层也就是分为两种:

  1. set方法注入
  2. 构造方法注入

自动注入

自动注入又分为两种:

  1. XML的autowire自动注入
  2. @Autowired注解的自动注入

XML的autowire自动注入

在XML中,我们可以在定义一个Bean时去指定这个Bean的自动注入模式:

  1. byType
  2. byName
  3. constructor
  4. default
  5. no

比如:

<bean id="userService" class="com.luban.service.UserService" autowire="byType"/>

这么写,表示Spring会自动的给userService中所有的属性自动赋值(不需要这个属性上有@Autowired注解,但需要这个属性有对应的set方法)。

在创建Bean的过程中,在填充属性时,Spring会去解析当前类,把当前类的所有方法都解析出来,Spring会去解析每个方法得到对应的PropertyDescriptor对象,PropertyDescriptor中有几个属性:

  1. name:这个name并不是方法的名字,而是拿方法名字进过处理后的名字如果方法名字以“get”开头,比如“getXXX”,那么name=XXX;如果方法名字以“is”开头,比如“isXXX”,那么name=XXX;如果方法名字以“set”开头,比如“setXXX”,那么name=XXX)
  2. readMethodRef:表示get方法的Method对象的引用
  3. readMethodName:表示get方法的名字
  4. writeMethodRef:表示set方法的Method对象的引用
  5. writeMethodName:表示set方法的名字
  6. propertyTypeRef:如果有get方法那么对应的就是返回值的类型,如果是set方法那么对应的就是set方法中唯一参数的类型

get方法的定义是: 方法参数个数为0个,并且 (方法名字以"get"开头 或者 方法名字以"is"开头并且方法的返回类型为boolean)

set方法的定义是:方法参数个数为1个,并且 (方法名字以"set"开头并且方法返回类型为void)

所以,Spring在通过byName的自动填充属性时流程是:

  1. 找到所有set方法所对应的XXX部分的名字
  2. 根据XXX部分的名字去获取bean

S

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统内存的探测

lab2 系统内存的探测 参考博客 主要涉及操作系统的物理内存管理。 操作系统为了使用内存&#xff0c;还需高效地管理内存资源。 这里我们会了解并且自己动手完成一个简单的物理内存管理系统。实验目的 理解基于段页式内存地址的转换机制 理解页表的建立和使用方法 理解物理内…

Python之线程Thread(一)

一、什么是线程 线程(Thread)特点: 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;…

【JavaEE】_CSS引入方式与选择器

目录 1. 基本语法格式 2. 引入方式 2.1 内部样式 2.2 内联样式 2.3 外部样式 3. 基础选择器 3.1 标签选择器 3.2 类选择器 3.3 ID选择器 4. 复合选择器 4.1 后代选择器 4.2 子选择器 4.3 并集选择器 4.4 伪类选择器 1. 基本语法格式 选择器若干属性声明 2. 引入…

c语言练习47:模拟实现strncat

模拟实现strncat 代码&#xff1a; #include<stdio.h> #include<assert.h> char* my_strncat(char* dest, const char* src, size_t num) {assert(dest ! NULL && src ! NULL);char* ret dest;while (num--) {*dest *src;}return ret; } int main() {ch…

【Linux】进程间通信(匿名管道、命名管道、共享内存等,包含代码示例)

进程间通信 前言正式开始理解进程间通信一些标准管道原理管道演示匿名管道代码演示原理进程池管道大小 命名管道演示代码分配消息例子 systemV共享内存共享内存流程获取key值shm的创建shm的删除关联去关联完整流程演示开始通信 systemV 消息队列基于对共享内存的理解几个概念 前…

mysql的索引语法

创建索引 CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name ( index_col_name,... ) ; 普通索引 name字段为姓名字段&#xff0c;该字段的值可能会重复&#xff0c;为该字段创建索引。 CREATE INDEX idx_user_name ON tb_user(name); 唯一索引 phone手机…

我的网站每个月给我带来了6W美元收入

2014 年,我开始在东京寻找软件工程工作。 但我不想要任何旧工作。我想要一个——因为没有更好的术语——实际上很好的。 因为我听说过一些关于日本科技行业的可怕事情。过度劳累的故事。低工资。令人畏惧的日本“黑公司”。 但尽管有这些故事,我相信也有优秀的科技公司。于…

windows各种运行库一次性解决方法

3DM游戏运行库合集离线安装包&#xff08;1G&#xff09; - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cnhttps://www.52pojie.cn/thread-1308401-1-1.html新的电脑系统上,运行一个软件,报缺少.dll,不是少了.net 就是少了 directx,vc runtime,下载…

黑马头条学习中的一些问题

1.在day3&#xff0c;上传图片时候&#xff0c;有一个错误&#xff0c;我完成代码逻辑后&#xff0c;启动进行上传时&#xff0c;发现报错了&#xff0c;报的是空指针异常 开始我认为微服务之间使用threadlocal是无法进行数据共享的&#xff0c;但是我有顺着老师讲的思路走了一…

Navicat15 /16 已连接数据库密码解密

前言 相信你会遇到使用navicat忘记已连接数据密码的问题吧&#xff01;实在是&#xff0c;密码太多容易忘记&#xff01;&#xff01;&#xff01; 感谢大佬as_dmy的文章如何查看navicat已连接数据库密码&#xff0c;然后才有了此文&#xff01; 1.0版本需要手动查看导出的co…

GET 和 POST请求的区别是什么

GET和POST是HTTP请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中&#xff0c;POST通过request body传递参数。 你轻轻松松的给出了一个“标准答案”&#xff1a; GET在浏览器回退时是无害的…

互联网真实赚钱平台有哪些?分享六大类正规靠谱的线上平台

互联网已经和我们的生活密不可分&#xff0c;我们每天都穿梭在网络的世界里&#xff0c;感受着信息的洪流&#xff0c;但同时也感受到了贫富差距的日益拉大。然而&#xff0c;互联网的蓬勃发展也为我们提供了一个机会——通过在线平台赚取真实的收入。 尽管在这个领域中存在着许…

QUIC协议连接详解(二)

目录 一&#xff1a;RTT解释 二&#xff1a;QUIC 1-RTT连接 三&#xff1a;QUIC 0-RTT连接 一&#xff1a;RTT解释 在介绍QUIC协议的连接之前先科普一下什么是RTT。RTT是Round-Trip Time的英文缩写&#xff0c;翻译过来就是一趟来回的时间即往返时延。时间计算即从发送方发送…

工作每天都在用的 DNS 协议,你真的了解么?

♥ 前 言 我们经常访问一些网址的时候&#xff0c;浏览器里输入类似于 www.baidu.com 这样的地址&#xff0c;那么在浏览器里输入这个地址---> 百度服务器给我们返回这个百度的页面&#xff0c;中间的过程是什么样的呢&#xff1f; 带着这个问题&#xff0c;我们一起来解…

答题题库模拟考试流量主小程序源码开发

一款专门为练题开发的题库答题考试模拟小程序&#xff0c;适用于多种用户群体&#xff0c;驾照考题、各种职业考试、英语四六级等等。接入流量主功能&#xff0c;运营方可以更灵活的配置收益方式。 小程序核心功能介绍&#xff1a; 1、多题型支持&#xff0c;判断题、单选题…

记一次Nacos线程数飙升排查

近日有个项目用到了Nacos做注册中心。运行一段时间发现Nacos服务的线程数达到了1k。这肯定是不正常的。 环境&#xff1a; Nacos-server 2.2.3docker-compose编排部署 nacos:image: "nacos/nacos-server:latest"environment:- JAVA_OPTS-XX:MetaspaceSize128m -XX:…

PLC-Recorder离线分析软件Ana里为什么不能显示变量的编号?

在PLC-Recorder在线软件里&#xff0c;大家可以在曲线上找到变量的编号&#xff08;由通道编号、变量类型、同类型序号组成&#xff09;。这个编号也是各软件识别变量的唯一标识。在变量和PLC很多时&#xff0c;可以方便地找到对应的PLC&#xff0c;如下&#xff1a; 有朋友问&…

【QGIS】Openstreetmap获取路网数据

目录 一、从Openstreetmap获取路网数据 1.1 根据城市名获取对应ID 1.2 根据城市ID获取路网数据 二、下载安装QGIS 2.1 下载QGIS 2.2 安装QGIS 2.3 页面语言设置 三、将获取到的osm文件拖入QGIS 一、从Openstreetmap获取路网数据 在大多数研究中&#xff0c;经常使用到的…

类欧笔记存档

电子版&#xff1a;https://blog.csdn.net/zhangtingxiqwq/article/details/132718582

【JavaScript手撕代码】instanceof

目录 instanceof手写详解 instanceof 手写 /* * param {Object} obj 需要判断的数据 * param {Object} constructor 这里请注意 * return {Boolean} **/ function myInstanceof(obj, constructor){if (![function, object].includes(typeof obj) || obj null) return falsel…