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

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

目录

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 {
    @Autowired
    private 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;
    @Autowired
    public 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)最主要的就是上述内容了,如果有缺漏,请各位大佬多多担待,可以在评论区补充一下哟!!!

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能中的概率魔法:解锁不确定性的智慧之钥

在人工智能(AI)的广阔天地中,概率论以其独特的魅力,成为了连接现实世界与智能决策的桥梁。从语音识别到图像识别,从自然语言处理到机器翻译,从智能推荐到自动驾驶,概率论知识在这些领域中发挥着…

ONVIF系列三:ONVIF客户端实现

ONVIF系列: ONVIF系列一:ONVIF介绍 ONVIF系列二:Ubuntu安装gSOAP、生成ONVIF代码框架 ONVIF系列三:ONVIF客户端实现 在系列二中完成了在Ubuntu上安装gSOAP并生成ONVIF代码框架,接下来我们利用生成的框架实现ONVIF客户端…

Spring框架核心:揭秘Java厨房的智能烹饪艺术

前情回顾:Spring框架深度解析:打造你的Java应用梦工厂 六. 实现控制反转 6.1 描述如何在Spring中实现IoC 在Spring Town的厨房里,实现控制反转就像是将食材的采购和准备过程外包给了一个智能系统。这个系统知道每种食材的特性,也…

质量保障之精准测试!

一、背景与概念 随着软件测试行业的长足发展,测试理念、技术都在发生着日新月异的变化。因此一套完整的自动化测试用例对于每个软件公司都是不可或缺的,然而虽然有如此规模宏大的自动化案例集资源投入,同时也有大量人力的投入,但…

深入理解Python的类,实例和type函数

问题起源: class t():pass s1 t() s2 type("Student2",(),{}) isinstance(s1, type), isinstance(s2, type)为什么第一个是false,第二个是true呢 根因定位: 在Python中,一切皆对象,类是对象&#xff0c…

AI+新能源充电桩数据集

需要的同学私信联系,推荐关注上面图片右下角的订阅号平台 自取下载。 随着我国新能源汽车市场的蓬勃发展,充电桩的需求量日益增加,充电桩的智能化程度不仅影响充电站运营商的经营效益,也大大影响着用户的充电体验。AI技术可以涵盖…

STK12 RPO模块学习 (1)

一、背景介绍 在STK12中,在Astrogator的模块上开发了新的模块(Rendezvous and proximity operations)。轨道交会接近通常来说是一个很复杂的过程。RPO实现需要对轨道动力学有一个清晰的理解,并且对于Astrogator模块具备很强的背景和经验&…

AI翻唱+视频剪辑全流程实战

目录 一、AI翻唱之模型训练 (1)模型部署 (2)数据集制作——搜集素材 (3)数据集制作——提升音频质量 方法一:使用RVC提供的音频处理功能。 方法二:可以使用音频剪辑工具Ad…

【软设】常见易错题汇总

目录 计算机系统基础 程序语言基础 数据结构 算法设计与分析 计算机网络与信息安全 软件工程基础 开发方法(结构化与面向对象) 数据库 操作系统 知识产权相关的法律法规 🤯🤯🤯🤯🤯&#x1f9…

基于Springboot的实习生管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的实习生管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

APP反抓包 - 客户端证书验证进阶(代码混淆)

1.关于混淆 在安卓开发中,对于第三方的包是可以进行混淆的,例如:OKHttp3.Http.Cert.check 被混淆后可以是a.f.c.b 形式。在安卓开发中,系统包是无法混淆的,例如:java.security.KeyStore不会被混淆。由于这种的情况的存在,再次审示我们之前的通用脚本,就会发现他是不通用…

基于GD32的简易数字示波器(5)- 软件_控制LED

这期记录的是项目实战,做一个简易的数字示波器。 教程来源于嘉立创,帖子主要做学习记录,方便以后查看。 本期主要介绍GPIO口的输入输出模式,使用其中的输出模式驱动LED。详细教程可观看下方链接。 2.2 LED控制实验 语雀 1、LE…

synchronized 使用及实现原理

synchronized 关键字 如何使用 synchronized 关键字的使用方式主要有下面 3 种: 修饰实例方法 修饰静态方法 修饰代码块 1、修饰实例方法 (锁当前对象实例) 给当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁 。 …

ViewModel 完全指南:实践与背后原理全解

一、引言 在现代Android应用开发中,处理UI数据的有效管理和状态保持是开发者面临的重要挑战之一。Google推出的Jetpack组件库中的ViewModel已成为解决这些问题的关键工具。ViewModel旨在以生命周期意识的方式存储和管理界面相关的数据,从而使数据在配置…

暴力法解决最近对问题和凸包问题-实现可视化

目录 最近对问题 凸包问题 最近对问题 顾名思义就是采用蛮力法求出所有点之间的距离,然后进行比较找出第一个最近对,一个一个进行比较。 大概思路就是如图(每个圈代表一个数对) 第一个和其他四个比较 第二个和其他三个比较 …

C++类和对象下——实现日期类

前言 在学习了类和对象的六大成员函数后,为了巩固我们学习的知识可以手写一个日期类来帮助我们理解类和对象,加深对于其的了解。 默认函数 构造函数 既然是写类和对象,我们首先就要定义一个类,然后根据实际需要来加入类的数据与函…

计算机Java项目|Springboot房产销售系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

Windows下安装Node.js、npm和electronic,并运行一个Hello, World!脚本程序

20240510 By wdhuag 目录 简介: 参考: 安装Node.js 安装npm 配置npm: 修改包存放目录和缓存目录 切换镜像源 使用 nrm 切换镜像源 安装Electron 运行一个Hello, World!脚本程序 安装Yarn JavaScript 指南 简介: Nod…

flash attention的CUDA实现探讨-V3

之前关于flash attention的实现参考添加链接描述,添加链接描述,添加链接描述 lash attention的数学变换:给定三个矩阵Q,K,V,形状都是[N,d],计算S=QK.T,然后针对dim=1做softmax,然后和V继续做矩阵乘法得到形状为[N,d]的输出矩阵O,即O=softmax(QK.T,dim=1)V。 下面本人的…

物联网设计竞赛_2_Jetson Nano中文输入法配置安装vscode

1、装ibus和ibus依赖框架 sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 2、启动ibus im-config -s ibus 3、安装拼音引擎 sudo apt-get install ibus-pinyin 4、重启linux系统 shutdown -r now 5、进入ibus设置添加中文 ibus-setup 插入中文p…