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

初学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修饰的类,后者可以!

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

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

相关文章

在Linux中进行Jenkins-2.190的安装及使用

Jenkins-2.190安装在公网IP为x.x.x.x的服务器上 环境准备 第一步,下载server-jre-8u202-linux-x64.tar.gz安装包。 登录地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html下载server-jre-8u202-linux-x64.tar.gz…

3自由度并联绘图机器人实现写字功能(一)

1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能。 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板Bigfish2.1扩展板电池7.4V锂电池 3. 功能…

能量密度的必要性:城市比乡村具有更高的能量密度

文章目录 引言I 人口密度1.1 人口密度太低对于经济的发展的不利因素1.2 足够的人口密度带来的好处1.3 乌鲁克城II 农耕文明和商业文明2.1 农耕文明2.2 商业文明III 有效掌握动力的文明处于优势3.1 苏美尔人- 轮子&风能的利用3.2 英国人- 以蒸汽机为代表的工业革命引言 文明…

作业3综合练习

综合练习: 要求:请给openlab搭建web网站 网站需求: 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于www.openlab.com/student #更改配置文件 (虚拟主机标签…

2023好玩的解压游戏,压力大点开玩可以放松自己

你是不是经常感觉到压力大? 现代社会,竞争逐步激烈,不管是来自学习上,工作上,还是生活上的,压力都非常大! 这时候,我们要学会自我减压,有效的放松是为了更好地前行。 …

新互联网人必学-产品经理课无密为伊消得人憔悴

新互联网人必学-产品经理课 download:https://www.666xit.com/3832/ 产品经理:连接用户需求和产品设计的重要角色 随着移动互联网的迅猛发展,产品经理已成为越来越多IT公司中不可或缺的职位。作为一名产品经理,他所扮演的角色是…

如何使用DNS实现融合CDN功能

将托管DNS解决方案与CDN配对可为您的网站提供额外的性能、可靠性和灵活性。 域名系统(DNS)是一种用于计算机、服务或连接到Internet或专用网络的任何资源的分层分布式命名系统,它将各种信息与分配给每个参与实体的域名相关联,它基…

【LeetCode】剑指 Offer 66. 构建乘积数组 p312 -- Java Version

题目链接:https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof/ 1. 题目介绍(66. 构建乘积数组) 给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素…

System V 共享内存

System V 共享内存 共享内存是什么如何使用共享内存ftokshmgetshmatshmdtshmctl 共享内存的原理共享内存实现两个进程间通信共享内存的特点共享内存与管道配合使用两个进程间通信多个进程间通信 共享内存是什么 🚀共享内存是最快的IPC形式。一旦这样的内存映射到共…

网络工程师的水平检测1

水平测试 文章目录 水平测试填空题(11分)判断题(9分)选择题(8分)简答题(26分)子网划分(24分)实验拓扑(19分)填空题(5分&am…

【MySQL】数据库完整性和安全性

目录 一、完整性 1.概念 2.sql语言支持的两种约束 2.1静态约束 撤销追加约束 断言 2.3动态约束 触发器 二、安全性 用DBMS对数据库实现的两个特性 一、完整性 1.概念 指dbms保证的db的一种特性,在任何情况下的正确性、有效性、一致性 原理图 广义完整性&…

园区路线地图指引图怎么画?园区地图三维图怎么画?

目前在园区信息化应用形式中,广泛缺乏专业电子地图的使用,因此,使这种高效的信息化工具的应用受到了很大限制。有些仅以图片代替,但图片没有空间计算、检索、路径设计的能力,在地图应用形式中,使用价值很低…

Day953.以假设驱动为指引 -遗留系统现代化实战

以假设驱动为指引 Hi,我是阿昌,今天学习记录的是关于以假设驱动为指引的内容。 很多人在做遗留系统现代化的时候呢,总觉得它是一个十分复杂的技术问题。 本来嘛,无论是代码的重构、架构的拆分,还是 DevOps 平台的搭…

除了学历,你更需要有能力

遥想当年,家里培养出一个大学生,是多荣耀的事!可现今却处于一个比较尴尬的状态。 为什么大学生贬值得这么厉害?其实大学生之所以会不值钱不外乎三大原因:量大、与企业需求不匹配、质量差。 高校扩招下,大…

Python每日一练(20230423)

目录 1. 删除链表的倒数第 N 个结点 🌟🌟 2. 最小覆盖子串 🌟🌟🌟 3. 二叉树的层序遍历 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏…

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

Java核心技术 卷1-总结-11 Java 集合框架将集合的接口与实现分离Collection接口迭代器泛型实用方法集合框架中的接口 Java 集合框架 将集合的接口与实现分离 Java集合类库将接口(interface)与实现(implementation)分离。 例如队…

小航助学答题系统编程等级考试scratch一级真题2023年3月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级(2019年3月)在线答题_程序猿下山的博客-CSDN博客_小航答题助手 1.下列说法不正确的是?( ) A.可以从声音库中随机…

使用buildroot编译完整系统【IMX6ULLPRO】

目录 构建 IMX6ULL Pro 版的根文件系统 编译系统 ​编辑 镜像文件 构建 IMX6ULL Pro 版的根文件系统 配置文件说明 编译系统 下面以 100ask_imx6ull_pro_ddr512m_systemV_qt5_defconfig 配置文 件为例,在 ubuntu 终端上说明 Buildroot 的配置过程&#x…

抖音数字人主播app

抖音数字人主播app是指一款利用计算机生成的虚拟数字人,在抖音平台上进行实时音视频传输和互动的应用程序。该软件可以让用户创建自己的虚拟数字人,并在抖音平台上进行实时互动和交流。 抖音数字人主播app通常需要包含以下功能: 3D建…

前端学习之路 来自前端方向学生的总结

恭喜您!您发现了宝藏! 我发现很多小伙伴,对于前端感兴趣,也很想去学好,但是却无从下手,不知道如何去学习。作为一名现处于大三即将大四的学生,借此机会来分享分享我的前端学习之路!…