Spring依赖注入的三种方式使用及优缺点

news/2024/5/3 23:04:53/文章来源:https://blog.csdn.net/qq_47908816/article/details/130257759

初学Spring的时候,我们从Spring容器中获取Bean对象都是通过bean标签先将Bean对象注册到Spring容器中,然后通过上下文对象congtext的getBean方法进行获取,显然这种方法较为麻烦,所以有了更简单的存方法:五大类注解;取方法:三种典型依赖注入(属性注入,Setter注入,构造方法注入),五大类注解以及依赖注入的简单使用详见博客:Spring中读取和存储Bean对象(5000字详解)_蜡笔小心眼子!的博客-CSDN博客

这篇博客主要针对三种依赖注入的优缺点及使用场景进行介绍!

目录

一,属性注入

1,属性注入的使用

 2,属性注入的优缺点

二,Setter注入

1,setter注入的使用

2,Setter注入的优缺点

三,构造方法注入

1,构造方法的使用

 2,构造方法的特点(不同于其他两种注入方式)

 3,构造方法注入的有优缺点

四,final对象能否被注入的原因


前置说明:这里的代码演示都是在UserController类里面使用UserService类,然后通过启动类调用UserController类,观察在UserController中是否通过三种依赖注入的方式获取到UserService对象,UserService代码及启动类(App)代码如下:

@Service
public class UserService {public void sayHi() {System.out.println("do userService sayHi()");}
}
public class App {public static void main(String[] args) {//1.获取 Spring 上下文对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2.获取 Bean 对象UserController userController = context.getBean("userController", UserController.class);//3.使用 Bean 对象userController.sayHi();}
}

一,属性注入

1,属性注入的使用

 属性注入针对于属性,将需要注入的Bean对象(这里是UserService)加上@Autowired注解(该单词的意思为自动注入),此时就可以将该对象从Spring容器中取出(前提必须加上五大类注解,否则Spring容器中不会有这个对象

 2,属性注入的优缺点

优点:

属性注入只需要在属性上面加一个@AutoWired注解,写法简便,可读性高,易维护(绝大部分实际开发中使用的都是属性注入的方式)

缺点:

  1. 不能注入final类修饰的属性;
  2. 属性注入兼容度差,只能在IoC容器中才能使用(类与IoC容器高度耦合),使用其他框架时不能使用属性注入
  3. 属性注入容器违背单一职责原则(单一职责原则:一个类最好只能做一件事,功能最好是单一的,在属性注入这里指的就是一个类最好只注入一个属性),因为属性注入简单方便的优势,开发者在开发的过程中就容易滥用属性注入,导致一个类中注入多个对象.

二,Setter注入

1,setter注入的使用

Setter注入就是使用Java的setter方法配合注解将Bean注入到当前类中;

 Setter注入针对于setter方法,通过方法将Bean对象从Spring中获取到并进行赋值(前提必须加上五大类注解,否则Spring容器中不会有这个对象

2,Setter注入的优缺点

优点:

Setter注入满足单一设计职责原则:因为setter方法的特性就是一个setter方法只对应一个对象,不会有注入多个对象的可能性;

 缺点:

  1. 不能注入final修饰的对象;
  2.  注入的对象可能会被修改:由于setter方法可以被多次调用,可能存在被修改的风险;

三,构造方法注入

1,构造方法的使用

构造方法顾名思义针对于构造方法,在构造方法上面加上注解将Bean对象注入到当前类中(前提必须加上五大类注解,否则Spring容器中不会有这个对象

 2,构造方法的特点(不同于其他两种注入方式)

当类中只有一个吻构造方法时可以省略@Autowired,当有多个构造方法时不可以省略,否则会报错(因为多个构造方法时不知道默认给哪个构造方法加注解);

 3,构造方法注入的有优缺点

优点:

  1. 能够注入final修饰的对象;
  2.  注入的对象不会被修改:因为构造方法只会被执行一次;
  3. 构造方法注入是完全初始化的:因为依赖注入是在构造方法内部执行的,而构造方法又是在类起初创建的时候就执行的,所以会被完全初始化;
  4. 通用性更好:构造方法注入因为基于Java的,JDK是最底层框架,所以无论在哪一个框架都可以适用.

缺点:

  1. 构造方法可以注入多个对象,违背了单一设计原则(假设这里再添加一个StudentService对象观察是否可以通过构造方法注入):
  2.  构造方法的写法较为麻烦.

四,final对象能否被注入的原因

Java规定被final修饰的属性只能在两个地方进行赋值:

  • 在定义的时候就进行赋值
  • 在构造方法内部进行赋值

属性注入和Setter方法注入都没有在定义的时候赋值(属性注入没有进行赋值,Setter方法注入是通过setter这个普通方法进行的赋值),构造方法则是通过构造方法进行了赋值,所以前两个不能注入final修饰的类,后者可以!

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

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

相关文章

Elasticsearch:了解和解决文档更新后 Elasticsearch 分数的变化

问题 问卷中有如下这样的文档,开发者想通过 match query 搜索这些文档来使用分数。 POST sample-index-test/_doc/1 {"first_name": "James","last_name" : "Osaka" } 以下是对上述文档的示例查询: GET sam…

贾其萃 : 笃行实践 筑梦扬帆 | 提升之路系列(二)

导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的“π”型人才,由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

LeetCode特训 --- Week2 (主打滑动窗口 + 字符串匹配题目)

目录 滑动窗口原理 真懂了滑动窗口? 滑动 字符串细节 开干切题 滑动窗口原理 滑动窗口:维护一前一后两根指针, 或者说一左一右两个指针。更主要的是维护左右指针中的区间. 同时不断的向前滑动,直到整个序列滑动结束,前指针走到序列末尾…

有什么好用的远程工具吗

沟通在任何类型的工作中都扮演着重要的角色。但当谈到远程工作时,这一点就更为重要。因此,您的组织必须找到可以让您的团队保持一致的工具。 在某些方面,项目管理扮演着类似的角色。 您会注意到,下面的大多数工具都会直接影响您的…

Java核心技术 卷1-总结-10

Java核心技术 卷1-总结-10 通配符类型通配符概念通配符的超类型限定无限定通配符通配符捕获 通配符类型 通配符概念 通配符类型中&#xff0c;允许类型参数变化。 例如&#xff0c;通配符类型Pair<? extends Employee>表示任何泛型Pair类型&#xff0c;它的类型参数是…

【Linux】uptime命令详解平均负载

命令 ➜ ~ uptime 22:37 up 90 days, 21:45, 2 users, load averages: 2.91 3.46 3.81 具体含义 22:37&#xff1a;代表的是当前的系统时间&#xff0c;也即晚上10点37分。 up 90 days, 21:45&#xff1a;代表系统运行时间 2 users &#xff1a;当前两个用户 load averages: 2…

ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程

文章目录 ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程一、需求与思路二、 组织架构二、 人员协作四、 总结 ChatGPT实战100例 - (06) 10倍速可视化组织架构与人员协作流程 一、需求与思路 管理研发团队的过程中&#xff0c;组织架构与人员协作流程的可视化是…

知识变现海哥|你为什么知识却不富有,是你不懂这个道理

要有价值观念&#xff0c;要有交换思维。商业的本质都是基于价值交换&#xff0c;你能为别人提供多少价值&#xff0c;你就能赚多少米&#xff0c;你帮助别人处理的问题越多你越有价值&#xff0c;你能成就多少人你就能被多少人成就。这是商业行为的底层逻辑。 你没赚到米 一是…

初识C++之C++11

目录 一、C11的概念 二、统一的列表初始化 1.{ }初始化 2.initializer_list 三、decltype 四、lambda表达式 1. lambda表达式的出现原因 2. lambda表达式的使用 2.1 捕捉列表 2.2 参数列表 2.3 mutable 2.4 返回值类型 2.5 函数体 2.6 使用方式 3. lambda表达式…

【Python】如何用pyth做游戏脚本(太简单了吧)

文章目录 前言一、开发前景二、开发流程3.1、获取窗口句柄&#xff0c;把窗口置顶3. 2、截取游戏界面&#xff0c;分割图标&#xff0c;图片比较 二、程序核心-图标连接算法&#xff08;路径寻找&#xff09;四、开发总结五、源码总结 前言 简述&#xff1a;本文将以4399小游戏…

基于OpenCV与深度神经网络——实现证件识别扫描并1比1还原证件到A4纸上

前言 1.用拍照的证件照片正反面&#xff0c;实现用证件去复印到A4纸上的效果&#xff0c;还有证件的格式化识别。 图1&#xff1a;把拍照的证件1比1还原证件到A4纸上 图2&#xff1a;证件OCR格式化识别 2.使用Yolo做目标识别,Enet做边缘检测&#xff0c;Paddle OCR做文字识别&…

云智慧助力MLOps加速落地

背景 随着数字化和计算能力的发展&#xff0c;机器学习&#xff08;Machine Learning&#xff09;技术在提高企业生产力方面所涌现的潜力越来越被大家所重视&#xff0c;然而很多机器学习的模型及应用在实际的生产环境并未达到预期&#xff0c;大量的ML项目被证明是失败的。从…

玩机搞机----root面具的安装 更新 隐藏root 德尔塔面具等等综合解析

目前的机型都是root面具&#xff0c;今天的帖子主要分析下面具的一些使用常识。一般面具如何使用一参考我前面的帖子。基本步骤都是解锁bl---修补boot---刷入boot----安装面具apk。但目前很多app会检测系统root&#xff0c;对于有些敏感类软件例如银行等等然后会检测当前系统ro…

“码”上反馈,自动留痕:二维码助力湖塘街道人居环境巡查高效化

绍兴市柯桥区湖塘街道将农村人居环境巡查同二维码技术相结合&#xff0c;具体应用到了“村民垃圾分类检查”、“公厕卫生检查”和“各村垃圾分类工作的督导记录”这三项检查工作中&#xff0c;做到了“码”上反馈、自动留痕&#xff0c;有效提升了巡检实效&#xff0c;在2020年…

【youcans 的 OpenCV 学习课】21. Haar 小波变换与 Haar 特征检测(上)

专栏地址&#xff1a;『youcans 的图像处理学习课』 文章目录&#xff1a;『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】21. Haar 小波变换与 Haar 特征检测&#xff08;上&#xff09; 1. 小波变换1.1 小波变换基本概念例程 17_1&#xff1a;常用小波族…

selenium应用之抓取b站黑马视频目录建立学习计划Excel

需求故事&#xff1a; 最近时间一下子多了起来&#xff0c;用来学习Java是最合适不过了&#xff0c;但是去b站看视频难免会没有自制力&#xff0c;于是决定用selenium来抓取b站黑马Java视频的目录创建一个学习计划的Excel&#xff0c;便于进行学习进度的管理。 注&#xff1a;纯…

经典算法之快速排序

快速排序 【思想】选择一个元素作为标准&#xff0c;分别将小于该元素的元素放入该元素左边&#xff0c;大于该元素的元素放到该元素的右边&#xff0c;接下来分别对左右两边区间进行同样操作&#xff0c;直到整个数组有序。 【例子】 上述是一个未排序的数组&#xff0c;首…

【广州华锐互动】火电厂3D沉浸式事故体验,提高员工安全意识和应急处理能力

火电厂是一种重要的能源生产方式&#xff0c;但是在运营过程中也存在着一些风险和隐患。为了降低火电厂事故的发生率&#xff0c;提高员工的安全意识和应急处理能力&#xff0c;火电厂3D沉浸式事故体验系统成为了一个重要的工具&#xff0c;为企业安全管理起到了不可替代的作用…

【多线程】Java中是如何保证多线程间的数据共享的?

文章目录 前言一、Java的内存模型二、保证可见性的方式volatilesynchronizedlockfinal 三、volatile的底层实现总结 前言 在讨论这个问题之前&#xff0c;我们可以先瞅瞅Java的内存模型JMM&#xff0c;JMM可不要和JVM混为一谈。我们说的是内存模型JMM&#xff08;Java Memory …

Adobe国际认证证书,深化设计师个人优势!

Adobe国际认证又称为Adobe认证(英文:Adobe Certified Professional)是Adobe公司CEO签发的权威国际认证体系,旨在为用户提供Adobe软件的专业认证。 该体系基于Adobe核心技术及岗位实际应用操作能力的测评体系得到国际ISTE协会的认可&#xff0c;并在全球 148 个国家推广&#xf…