Spring - 更简单的获取 Bean 对象

news2025/1/17 21:47:37

目录

二、获取 Bean 对象(对象装配或者对象注入)

1. 属性注入

1.1 属性注入的优点和缺点:

2. Setter注入

 2.1 Setter注入的优点和缺点

3. 构造方法注入(spring 官方推荐的对象注入方式)

3.1 构造方法的优点和缺点

4. @Autowired 注解 和 @Resource 注解的区别

4.1 @Autowired 和 @Source 的区别


前言

    上一篇文章讲到了如何更简单的存储 Bean 对象,有两种方式:  1. 使用五大 类注解,2. 使用 @Bean 方法注解。这篇文章继续介绍如何更简单的获取 Bean 对象。

二、获取 Bean 对象(对象装配或者对象注入)

    对象注入 :  更加简单的读取 Bean 对象(指的是从 Spring 容器中读取某个对象,放到当前类里面)

    在 Spring 中实现依赖注入的常见方式有三种:

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

1. 属性注入

    目标:在 Controller 中 得到一个 Service 对象:(如下代码所示,使用 @Autowired 的方式来实现对象注入)

    注:如果是在一个静态方法中或者是一个静态属性,此时加载的时机是在 spring容器初始化之前开始执行的,所以不能在静态方法中使用属性注入获取 Bean 对象的。

    所以在启动类的 main 方法中还是用原来的方式获取到 Controller 对象,重点是关注使用属性注入的方式是否可以拿到 Service 这个 Bean 对象。

     如上图代码运行结果:就是使用属性注入的结果。

1.1 属性注入的优点和缺点:

    优点:属性注入的最大的优点就是实现简单,使用简单,只要给变量上边加上一个注解(@Auotwired),就可以在不 new 对象的情况下直接获取注入的对象了,(这就是DI,依赖注入)

    缺点:属性注入同样也会有很多问题,甚至编译器都不推荐使用这种方法,属性注入的缺点包含以下三个:

1. 功能性问题:无法注入一个不可变的对象(被 final 修饰的对象)

2.兼容性问题:只能适用于 IoC 容器,也就是在IoC容器之外这种方式就不适用了。
3. 设计原则问题:容易违反单一谁原则(单一原则:一个类或者一个方法就只实现一个功能)但是加了属性注入之后,就有了更多的 Bean 对象,此时承担的职责也就更多了。

2. Setter注入

     运行结果:

 2.1 Setter注入的优点和缺点

    优点:完全符合单一设计的原则,每一个Setter 只针对一个对象。

    缺点:

1. 不能注入不可变对象(final 修饰的对象)

2. 注入的对象可以被修改

 

 3. 构造方法注入(spring 官方推荐的对象注入方式)

     运行结果:

    特点: 如果当前类中只有一个构造方法的时候,允许在构造方法上面不加 @Autowired 注解,然后也是可以拿到 UserService 这个对象的;如下图运行结果:

     运行结果:

3.1 构造方法的优点和缺点

    优点:

1. 可以注入一个不可变的对象。(final 修饰的对象)在Java中,被final 修饰的对象必须满足两个条件中的任意一个:

    (1)final 修饰的对象,要么直接进行赋值。

    (2)final 修饰的对象,要么必须在构造方法中赋值。

2. 注入的对象不会被修改。(因为构造方法只能调用一次)
3. 注入的对象完全被初始化。(一个类是先执行实例化,然后执行初始化,在初始化时就会把 Bean 对象注入到当前类当中)
4. 兼容性更好。(构造方法是所有框架都支持的,所以脱离IoC容器也可以使用)

4. @Autowired 注解 和 @Resource 注解的区别

    在进行类注入的时候除了使用 @Autowired 注解之外,还可以使用 @Resource 注解,两种在大部分的场景下使用是没有区别的,都可以实现对象注入,但是也是有一点点区别的

4.1 @Autowired 和 @Source 的区别

  1. 出身不同:@Autowired 是属于spring 的,而 @Resource 来自于JDK的注解。

  2. 使用时设置的参数不同:相对 @Autowired,@Resource 支持更多的参数设置,我们可以看下两个注解的源码:

 

  3. @Autowired 可以在三种注入方法中都可以使用,但是 @Resource 只可以在 Setter注入和属性注入中使用,不能用在构造方法上,如下代码:

 

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

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

相关文章

【PHP面试题47】Redis的持久化有哪几种?有什么区别?谈谈你的理解

文章目录 一、前言二、RDB(Redis数据库)持久化方式2.1 触发条件2.2 RDB文件的格式2.3 RDB持久化原理2.4 RDB方式的优缺点 三、AOF(Append Only File)持久化方式3.1 触发条件3.2 AOF文件的格式3.3 AOF持久化原理3.4 AOF方式的优缺点…

cmake项目相关的变量

cmake项目相关的变量 在cmake项目中,通常需要对路径进行操作,比如我们需要知道源码的顶级目录,源码的构建目录和某个project名字相关的一些目录等。 CMAKE_SOURCE_DIR,这个变量的值代表的是源码的顶级目录。但是这个变量的值可能…

Python(十一)变量多次赋值

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【hadoop】部署hadoop的本地模式

hadoop的本地模式 本地模式的特点部署本地模式测试本地模式是否部署完成 本地模式的特点 没有HDFS、也没有Yarn只能测试MapReduce程序,作为一个普通的Java程序处理的数据是本地Linux的文件一般用于开发和测试 部署本地模式 进入该路径 /root/training/hadoop-2.7…

吴恩达机器学习2022-Jupyter

1 可选实验室: Python、 NumPy 和矢量化 简要介绍本课程中使用的一些科学计算。特别是 NumPy 科学计算包及其与 python 的使用。 2 目标 在这个实验室里将回顾课程中使用的 NumPy 和 Python 的特性。 Python 是本课程中使用的编程语言。NumPy 库扩展了 python 的基本功能&a…

mac 如何批量修改图片名称

mac 如何批量修改图片名称?很多使用mac电脑的小伙伴一直有这样一个疑问,怎么在电脑上一次性的批量修改大量图片的名称,很多小伙伴在电脑上整理图片的时候都需要批量重命名,批量处理的功能可以让我们节省不少的时间和精力&#xff…

抖音seo怎么选择关键词

要查找抖音的关键词,以进行SEO优化,可以按照以下步骤进行: 1. 关键词分析与筛选: 首先,你需要确定你的目标受众和内容类型。了解你的目标用户是谁,他们可能会搜索什么样的内容。然后,使用关键…

虾皮一面:手写一个Strategy模式(策略模式)

说在前面 在40岁老架构师 尼恩的读者交流区(50)中,最近有指导一个小伙伴面试架构师,面试的公司包括虾皮、希音、美团等大厂,目标薪酬50K以上,遇到了一个比较初级的问题: 请手写一个Strategy模式(策略模式…

基于物联网技术的养老院管理系统设计与实现_kai

基于物联网技术的养老院管理系统设计与 实现 摘 要 随着我国老年人口数量的逐年增加,人口抚养比也在迅速攀升,越来越多的老年人将走 出家门进入养老院安度自己的晚年。同时国家和地方也相继出台了加快发展老龄事业的政策 方针,作为机构养老…

Shell之循环语句 —— For 实验

循环 循环就是重复执行一段代码的结构,通过循环可在满足一定的条件下,多次执行相同的代码。 循环语句:循环体 —— 代码的总结构 循环条件 —— 当循环条件满足时,循环体代码才会被执行,否则条件不满足…

SpringCloud Alibaba——Nacos中的Distro协议

一、Nacos中的Distro协议 Nacos 每个节点自己负责部分的写请求。每个节点会把自己负责的新增数据同步给其他节点。每个节点定时发送自己负责数据的校验值到其他节点来保持数据一致性每个节点独立处理读请求,及时从本地发出响应。新加入的 Distro 节点会进行全量数据…

【高并发网络通信架构】3.引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

目录 一,往期文章 二,基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 select,poll,epoll 三者对比 三,函数清单 1.select 方法 2.fd_set 结构体 3.poll 方法 4.struct pollfd 结构体 5.epoll_cre…

前端uni-app自定义精美全端复制文本插件,支持全端文本复制插件 可设置复制按钮颜色

随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现…

读数据压缩入门笔记07_自适应统计编码

1. 位置对熵的重要性 1.1. 为了计算概率总需要多遍历一次数据集,而在计算出整个数据集中各符号的出现概率后,还要继续处理这些数值 1.1.1. 如果是相对较小的数据集,那么这些就不是什么问题 1.2. 随着要压缩的数据集变大,统计编…

Python异常值检测——案例分析

目录 1.单个变量异常值检测 2. 双变量关系中的异常值检测 3. 使用线性回归来确定具有重大影响的数据点 4. 使用k最近邻算法找到离群值 5. 使用隔离森林算法查找异常 1.单个变量异常值检测 如果某个值离平均值有多个标准偏差,并且远离近似标准正态分布的值&#…

Office如何通过VSTO进行WORD插件开发?

文章目录 0.引言1.工具准备2.WORD外接程序创建和生成3.外接程序生成并使用 0.引言 VSTO(Visual Studio Tools for Office )是VBA的替代,是一套用于创建自定义Office应用程序的Visual Studio工具包。VSTO可以用Visual Basic 或者Visual C#扩展…

在 3ds max 中创建逼真的镜像材质

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 选项 1.平面镜面材料 步骤 1 首先,我们需要包含镜像对象和一个或多个镜像对象的场景。您可以在此处下载本教程中使用的场景,也可以使用您自己的场景和对象。对于第一个镜像选项&…

Unreal Engine 与 Blender - 比较指南

虚幻引擎和 Blender 是游戏开发人员中最常用的两种软件,它们在游戏开发工作流程中都有自己的用途和地位。作为进入视频游戏行业的初学者,可能很难从数十种软件中筛选找到最适合您需求的一款。希望本指南能够缓解这一困难并帮助您决定选择哪个软件。 虚幻…

【c++源码】瑞佳飞飞彩虹端分享老飞飞源码

里面功能包含。离线摆摊,内挂,宠物系统,宠物进阶,任意商店,回收装备,模型查看,个人排行榜,物品分解,全物品升级,钥匙开箱子,外观变更,…

电商数据采集方式有哪些

不管是做渠道管控、还是价格监测,数据采集都是基础,只有数据准确了,品牌才能更好的管控乱价、治理渠道。同时当品牌有数据分析需求时,对数据采集的要求也会越高。 力维网络有自主开发的数据采集监测系统,可为品牌提供多…