news 2026/6/9 22:29:10

SpringDI

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringDI

啥叫DI

SpringDI,翻译过来叫做依赖注入,之前我们使用springIoc去把累交给spring管理,现在我们要把他取出来,就是通过DI(依赖注入的方式),也就是说

SpringDI是SpringIOC思想的具体实现

DI(依赖注入的三种方式)

  1. 属性注入
  2. 构造方法注入
  3. Setter方法注入

属性注入

首先,把另外一个类作为属性放到一个类中,作为属性的类必须提交给spring管理,否则使用DI注入的时候会报错

  1. 作为属性不交给spring管理

不交给spring管理,相当于你不往水壶里面倒水,怎么可能倒得出来水

  1. 不加@Autowired注解

不加注解,就会报空指针异常,就好像你往水壶里加水了,倒出来的时候没说去哪个水壶里面倒水

构造方法注入

首先在创建hello的时候,会先看到检查依赖,发现依赖service,就会先处理service这个依赖,然后去看ioc内有没有这个,没有就先尝试创建这个实例,如果这个类没有加注解就会报错,有的话就会注入,然后再创建controller同样的,这个也是需要service这个类交给spring去管理,否则就会报错

如果存在多个构造函数呢?

这里我们可以看出,默认实例化的时候是使用无参构造函数的,就会跳过检查依赖的步骤,直接就选中无参的并进行创建,由于service是空的,所以就会一直报空指针异常

如何解决,手动指定你要调用的

存在多个的时候,需要手动指定你要调用的加上@Autowired即可

Setter注入

Setter会由spring自动识别并注入,只要加了@Autowired的注解,就会自动注入,不加注解就无法执行

出现无法注入的问题,因为不知道注入给谁

三种注入的优缺点

属性注入

优点:简洁,使用方便

缺点:只能用于IOC容器,只有在使用的时候才会报空指针异常

不能注入一个final修饰的属性

不能注入final的原因:

执行构造函数的时候,final已经被赋值了,等对象创建好了之后,这个时候spring才刚刚通过反射拿到,时机已经错过了

构造函数注入

优点:1. 可以注入final修饰的(在执行构造函数的时候,也就final被赋值的时候,这个时候就可以注入)

2.注入的对象不会被修改(被final修饰的情况下)

如果是不被final修饰那就是可以被修改的

  1. 依赖的对象在使用前会被初始化,因为依赖在类的构造方法中
  2. 通用性强

缺点:注入对象多的时候,代码就会很繁琐

Setter注入

优点:在类实例化之后,可以重新对该对象进行注入或者配置

缺点:不能注入一个final修饰的属性

注入的对象可能会改变(setter被调用多次)

@Autowired存在的问题

有两个user的对象,提交给了spring进行管理,这个时候我们想要进行注入,就会报错,因为有两个对象,不知道注入哪个

如何解决这种问题spring提供了三种方式

@Primary

@Qualifier

@Resource

第一种@primary

加入注解@Primary,告诉编译器,实现的时候默认使用我加注解的

@Qualify

不能单独使用,需要配合注解@Autowired使用,指定使用注入是谁

使用@Qualifier,在ioc的多个同类的对象中,可以指定注入,不可单独使用,需要配合注解@Autowired使用

@Resource

JDK提供的注解

@Resource里面填写的是bean的名称,这个是由jdk内部提供的注解

@Autowired与@Resource区别

  1. @Autowired是spring架构提供的@Resource是JDK提供的

2. @Autowired默认是按照类型注入,@Resource默认是按照bean的名称注入

Autowired的装配过程

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 19:54:56

RS罗德与施瓦茨 ZNB20 矢量网络分析仪

主要特点 频率范围介于 9 kHz 至 43.5 GHz 两个或四个端口 蕞高 140 dB 的宽动态范围 扫描时间短暂,扫描 401 个点仅需 4 ms 98 dB 的较宽功率扫描范围多功能仪器可用于多种应用 罗德与施瓦茨ZNB网络分析仪的频率范围介于 9 kHz 至 4.5/8.5 GHz 和 100 kHz 至 20/26…

作者头像 李华
网站建设 2026/6/9 1:54:37

百度网盘高速下载终极指南:一键获取真实直链地址

百度网盘高速下载终极指南:一键获取真实直链地址 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的下载速度而烦恼吗?这款开源解析工具将…

作者头像 李华
网站建设 2026/6/9 21:06:30

Blender MMD集成专业指南:3D动画数据转换的深度解析

Blender MMD集成专业指南:3D动画数据转换的深度解析 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools 在数…

作者头像 李华
网站建设 2026/5/24 13:30:55

Docker健康检查确保PyTorch服务持续可用

Docker健康检查确保PyTorch服务持续可用 在现代AI工程实践中,一个看似正常运行的容器可能早已“名存实亡”——进程没崩溃,端口也开着,但模型推理请求却迟迟得不到响应。这种“假死”状态在GPU加速的深度学习服务中尤为常见:显存泄…

作者头像 李华
网站建设 2026/6/9 21:08:23

5个超实用窗口置顶技巧,让你的工作效率暴涨300%

5个超实用窗口置顶技巧,让你的工作效率暴涨300% 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 还在为频繁切换窗口而浪费时间吗?窗口置顶功能是现代多任…

作者头像 李华
网站建设 2026/6/6 7:26:02

终极指南:DLSS Swapper - 游戏图形技术版本管理神器

终极指南:DLSS Swapper - 游戏图形技术版本管理神器 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏中DLSS版本过旧而烦恼?每次游戏更新后新版本的DLSS效果反而不如老版本&#xff1f…

作者头像 李华