详解依赖注入的三种方法以及遇到问题的解决

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 

目录

1.三种依赖注入的方法

1.属性注入

优点

缺点

2.构造方法注入

优点

缺点

3.Setter注入

优点 

缺点

4.小结

2.依赖注入常见问题的解决

1.属性注入需要的依赖的类有多个对象

1.让属性名和bean的名字相同

2.使用@Primary注解

3.使用@Qualifier注解

4.使用@Resource注解

3.@Resource和@Autowired的区别

@Autowired

@Resource

小结

4.总结


1.三种依赖注入的方法

依赖注入(Dependency Injection)也就是我们常说的DI,它是IoC思想的一种实现。DI强调的是将Spring容器中的Bean提供给需要Bean的变量。DI的实现有助于代码的解耦。注入依赖有三种不同的方法:

1.属性注入

我们可以直接在属性上方使用@Autowired注解,这样当这个对象是被交给Spring管理的对象时,它会自动为@Autowired注解的变量注入依赖对象

@Data
public class DI {@Autowiredprivate UserInfo userInfo;
}
@Data
public class UserInfo {private String name;private Integer age;private String tele;
}

我们用下面的代码在启动类中拿到userInfo的值

        ApplicationContext context=SpringApplication.run(DemoApplication.class, args);UserInfo ui=context.getBean(DI.class).getUserInfo();System.out.print(ui);

优点

属性注入简单便捷,会使代码看起来很整洁。并且当我们需要增加依赖时,直接增加一串属性和注解即可。

缺点

属性注入是不能注入final修饰的属性的,并且过度使用会使代码可读性变差。如果没有注入注入它在使用时才会出现空指针异常。

2.构造方法注入

我们可以使用构造方法来对类的属性进行依赖注入,如下:

public class DI {private UserInfo userInfo;public DI(UserInfo userInfo) {this.userInfo=userInfo;}
}

我们甚至不需要使用@Autowired,因为只有一个构造方法时,spring实例对象时必定要经过这个构造方法。但是如果有多个构造方法就要用@Autowired来表明使用那个构造方法实例对象。

优点

构造方法注入依赖时可以注入final修饰的属性,并且构造方法注入的对象没有Setter方法是不能再进行更改的。并且因为构造方法是JDK提供的,所以它的适配性好,不仅仅适配Spring框架,还可以适配其他的框架。并且依赖使用前必定会被初始化,因为构造方法是在实例对象时就会执行的。

缺点

当要注入的属性过多时,操作就会繁琐起来,并且要添加属性时就要修改构造方法,比较麻烦。

3.Setter注入

setter的原理也就是和我们平时使用setter差不多,只不过这里我们是把setter方法给到spring,让spring帮我们执行注入依赖。在使用setter时要使用注解@Autowired,很好理解在实例对象时setter方法是不会像构造方法一样自动调用的,所以要使用注解。使用方法如下:

@Controller
@Data
public class DI {private UserInfo userInfo;@Autowiredpublic void setUserInfo(UserInfo userInfo) {this.userInfo=userInfo;}
}
优点 

其实没啥优点,硬要说就是它注入的依赖我们可以在后续修改,但是平时我们使用DI时基本都是把不怎么改变的对象存入容器中,如果真的要改变还不如自己new一个,改变的更方便。

缺点

缺点就是后续可以通过setter方法去改依赖,可能造成一些安全问题。

4.小结

属性注入和构造方法注入各有优点,setter没什么好说的,建议一般情况下不要使用。Spring官方推荐使用构造方法注入,但是属性注入实在是太香了,方便的很,以至于官方自己都在用。所以只能说按需使用吧。🙂

2.依赖注入常见问题的解决

说完了依赖注入的三种方法之后,我们来讲讲依赖注入常见问题的解决。

1.属性注入需要的依赖的类有多个对象

当我们使用属性注入时是直接在属性上加上@Autowired,因为@Autowired是按照类型来查找的,所以当这个类型有多个对象时,我们有时候会遇到以下问题:

我们可以看到红线标识文字所描述的,依赖只需要一个,但是spring找到了两个,怎么办呢?这时候有4种解决办法 :

1.让属性名和bean的名字相同

因为@Autowired是先找类型相同的bean,当发现有多个bean时,就根据类型名在这多个bean中找,如果找到了就使用这个bean,如果没找到就上报图错误。

 

这样就可以找到userInfo这个方法所返回的UserInfo的实例对象。

2.使用@Primary注解

我们可以在使用@Bean注解的方法上加上@Primary注解,表示获取依赖时,@Primary修饰的方法的返回类型如果是所需求依赖的类型,那么依赖就会注入@Primary修饰的方法返回的bean。但是这种方法很大的限制了bean的注入。因为如果只能单一的获取一个bean,那么就当我们想获取另外一个bean时就会变得很困难。使用方法如下:

3.使用@Qualifier注解

@Qualifier注解可以在@Autowired寻找到类型之后指定查找bean的名字。只要在@Qualifier的括号中写上bean的名字即可(记得带“”),这样属性名就不一定非要和bean名一样了。

在这里我们拓展一下。我上一篇五大注解存入容器中的默认名称为小驼峰(特殊情况:当首字母和第二个字母都是大写时,那么就是类型名)。而@Bean注解存入容器中默认名称就是方法名。

使用方法如下图:

 

4.使用@Resource注解

@Resource注解可以直接根据名称搜索bean,在@Resource的括号中写上name=“bean名”就好,当然也可以不加,那么类型名就是查找的名称。

使用方法如下图:

我们可以看到@Resource注解是不需要使用@Autowired的,这就要说到@Resource@Autowired的区别了。

3.@Resource和@Autowired的区别

@Autowired

@Autowired是Spring提供的注解。它是根据类型来查找bean的,我们上面说过,当发现有多个bean时,就根据类型名在这多个bean中找,如果找到了就使用这个bean,没找到就报错。

@Resource

@Resource是JDK提供的注解。它是默认根据bean名称来查找bean的,也可以按照类型查找bean,都查不到就报错。

小结

@Resource和@Autowired的提供者不同,并且默认查找方式也不同。@Resource的功能更加丰富,如图:

@Autowired

 

@Resource
@Resource

 

并且它们都可以使用@Qualifier来指定名称。我们可以根据需求选择合适的注解。

4.总结

spring的依赖注入(DI)最主要的就是上述内容了,如果有缺漏,请各位大佬多多担待,可以在评论区补充一下哟!!!

制作不易,望各位大佬赏个脸,给个三连吧!!谢谢各位大佬了!!!

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

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

相关文章

如何不用额外变量交换两个数

int a 19int b 33 交换 正常代码 int a 19;int b 33;int tmp 0;tmp a;a b;b tmp; 这个代码都见过,都写过 使用如下代码 int a 19;int b 33;a a ^ b;b a ^ b;a a ^ b;System.out.println(a);System.out.println(b); 分析 假设a x ; b y; a a ^ b…

图层遮盖判定算法实现2

图层遮盖判定算法实现2 1. 点击时调用置灰2. 解决方式 图层遮盖判定算法实现2 学习于bilibili 尚学堂官方 1. 点击时调用置灰 在Brand中 if (brand.getGray()){//灰色return;}else {brand.getParent().remove(brand);//通过父容器删掉自己 一般树形结构使用此方式//也需要…

linux Nginx安装与启动

一、先到官网下载Nginx 官网地址: http://nginx.org/en/download.html 我下载的是nginx-1.20.2 二、下载好的文件上传到服务器,然后解压 1、上传到指定的服务器地址,我这里是公司服务器,目录都是定义好的,自己玩建…

Flutter 中的 ToggleButtons 小部件:全面指南

Flutter 中的 ToggleButtons 小部件:全面指南 在 Flutter 中,ToggleButtons 是一种允许用户在一组选项中进行切换选择的控件。它通常用于展示一组相关选项,让用户可以快速切换选择。ToggleButtons 是一种水平排列的按钮集合,其中…

数据结构与算法学习笔记之线性表五---循环链表的表示和实现(C++)

目录 前言 1.双向链表的定义 2.双向链表的表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.表长 6.获取数据元素 7.前驱节点 8.后继节点 9.插入 10.删除 11.遍历 12.完整代码 前言 记录下双向链表的表示和实现。 1.循环链表的定义 循环链表(circular linked list)…

The Onion Router-洋葱

目录 Tor的运作原理 Tor挑战和局限性 Tor,即The Onion Router(洋葱路由器),是一个用于匿名通信的开放网络,它旨在增强用户的隐私和安全。Tor的名字源自其设计原理,类似于将信息包装在多层“洋葱”中&…

本来还挺喜欢……

前阵子买了个天空星开发板,到手之后发觉不对劲。 之前我们玩玩开发板都是用的面包板的,就算是ESP那种比较宽的板子用两个面包板拼一下也勉强可以用。 但是天空星它的引脚是分为两组,每组有两排,如果我们还是直接使用面包板的话&a…

C 语言函数:入门指南

C 语言中的函数声明和定义 您可以通过以下方式创建并调用函数: // 创建一个函数 void myFunction() {printf("我刚被执行了!"); }int main() {myFunction(); // 调用函数return 0; }一个函数包括两个部分: 声明:函数名称、返回类…

单页源码加密屋zip文件加密API源码

简介: 单页源码加密屋zip文件加密API源码 api源码里面的参数已改好,往服务器或主机一丢就行,出现不能加密了就是加密次数达到上限了,告诉我在到后台修改加密次数 点击下载

Spring事务-使用@Transactional在事务中立即提交部分数据库操作

目录 一、背景 二、需求 三、Spring事务的传播级别及失效场景 1.Spring事务的传播级别 2.失效场景及正确用法 一、背景 在项目中使用数据库锁表实现分布式锁,在方法A中调用方法B,方法B是一个多节点同步的方法,内部使用写锁表的逻辑实现分…

【文献阅读】企业ESG表现与创新——来自A股上市公司的证据

企业ESG表现与创新——来自A股上市公司的证据 1.引言 第一段——背景介绍 可持续发展 碳达峰、碳中和 ESG既是从微观层面解决全球性社会问题的必要,也是实现我国经济转型、促进高质量发展的有效手段。 2017.12证监会:重点排污企业的环境披露 2021.6证监…

【ARM Cortex-M 系列 2.1 -- Cortex-M7 Debug system registers】

请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器(ICSR)Debug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障…

第十五篇:全面防护:构建不容侵犯的数据库安全策略与实战指南

全面防护:构建不容侵犯的数据库安全策略与实战指南 1. 引言:数据库安全的现代战略 1.1 简介:数据库安全在当今的数字化时代中的重要性 在数字化的浪潮中,数据已成为企业乃至国家的核心资产,其价值不亚于实体世界的黄…

第五百零三回

文章目录 1. 概念介绍2. 使用方法2.1 普通路由2.2 命名路由 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示Dialog"相关的内容,本章回中将介绍使用get进行路由管理.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Kubernetes(k8s)的Network Policies解析

目录 1.关键特性2.示例配置3.最佳实践4.注意事项 Kubernetes(k8s)的Network Policies是一种资源对象,用于定义Pod之间的网络通信规则,以此来控制和隔离集群内部的网络流量。这为Kubernetes集群提供了更细粒度的网络安全控制能力。…

RAG应用中的路由模式

依据的用户查询意图在 RAG 应用程序使用“路由控制模式”可以帮助我们创建更强大的 RAG 应用程序。我们通常希望用户能够访问的数据可以来自各种来源,如报告、文档、图片、数据库和第三方系统。 对于基于业务的 RAG 应用程序,我们可能还希望用户能够与其它业务系统进行交互,…

spring注解使用(例子)

Dao层: 接口: public interface UserDao {public void save(); } 实现类: Component //声明为组件(关键) public class UserDaoIim implements UserDao {Overridepublic void save() {System.out.println("sa…

大模型微调方法汇总

微调方法 Freeze方法P-tuning方法 prefix-tuningPrompt TuningP-tuning v1P-tuning v2Lora方法 重要相关参数LoRA 的优势Qlora方法 相关参数微调经验 模型选择模型大小选择数据处理微调方案英文模型需要做词表扩充吗?如何避免灾难遗忘大模型的幻觉问题微调后的输出…

戴尔数据泄露影响近五千万用户,数据保护应该得到重视

据BleepingComputer报道,电脑制造商戴尔因网站漏洞遭黑客入侵,约4900万用户信息疑遭泄露。根据黑客发布的销售帖子,泄露数据最多的前五个国家分别是美国、中国、印度、澳大利亚和加拿大。 据BleepingComputer报道,电脑制造商戴尔因…

Nios实验使用串口输出“Hello Nios-II”字符到笔记本电脑

目录 实验过程 创建工程 修改程序 编译工程 运行项目 效果实现 总结 参考 实验过程 硬件设计见博主上篇博客 软件部分设计 下面使用 Nios II Software Build Tools for Eclipse 来完成当前项目的软件开发。 启动 Nios II SBT 按照下图所示点击 Nios II Software Build…