Spring更简单的存储和读取Bean对象

news2024/10/7 7:33:28

目录

1.第一个Spring项目

2.存储Bean对象

2.1 准备工作

2.2 五大类注解

2.3 方法注解@Bean

2.4 Bean对象的默认命名规则

3. 读取Bean对象

3.1 属性注入

3.2 setter注入

3.3 构造方法注入

3.4 注入异常问题

3.5 注入方式优缺点

3.6 @Autowired和@Resource的区别


1.第一个Spring项目

在学习更简单的方式来读取和存储Bean对象之前,我们先来回忆一下之前Spring项目的创建以及在Spring-core项目中我们是如何创建和存储对象的。

上面的这种Spring对象的存储和读取方式虽然能够满足我们的需求,但是这也只是站在小项目的层面上来讲的。如果一个项目中的类多起来了,我们如果采用上面这种面向xml配置配置Spring存储Bean对象,那得在spring的配置文件中添加多少bean标签,并且id还不能够重复!所以这种操作Spring存储和读取Bean对象的做法太过复杂,接下来我们来看如何更简单的实现spring存储Bean对象以及从Spring中读取Bean对象的操作。 


2.存储Bean对象

2.1 准备工作

在使用注解来配置Spring存储对象时,需要先在spring配置文件中添加上以下的内容:


2.2 五大类注解

配置Bean对象被Spring识别的注解有以下五个,都能够实现被spring识别并将该Bean对象加载到容器中:

  1. @Controller(控制器存储)
  2. @Service(服务存储)
  3. @Repository(仓库存储)
  4. @Component(组建存储)
  5. @Configuration(配置存储)

为什么要有这么多的类注解?

这就与每个省市都有自己限定名称的车牌号一样,不仅能够节约号码,同时让别人看到能够大致清楚这是哪里的车牌号。我们的类注解也是这样,在项目开发中,一个项目中可能有特别多的类,并且不同的类可能归属于不同的层级,我们这几种类注解就是让程序员看到之后,能够直接了解该类的用途层级。如下图所示:


更详细一点:

  1. @Controller——控制器存储
    存储逻辑控制层的Bean对象。归属于程序的逻辑控制层。前端发送的数据通常会先经过逻辑控制层的控制器来判断传递的参数是否合法
  2. @Service——服务存储
    存储服务层的Bean对象。归属于程序的服务层。前端数据在经过控制器校验合法后将数据传递到服务层,而一个客户服务可能需要操控多张表,我们的服务层就负责调度底层的数据存储层逻辑来进行对应请求服务的处理。
  3. @Repository——仓库存储
    存储数据处理层的Bean对象。归属于持久层。通常情况下每一个表都会对应一个@Repository对象。该对象位于数据处理层,接受服务层的调度,完成对应的业务处理逻辑中涉及到的数据操作,这一层将直接与数据库打交道
  4. @Component——组件存储
    存储具有通用性质的工具类对象,归属于公共工具类,这些工具类提供了一些公共方法。
  5. @Configuration——配置存储
    归属于配置层,用来配置当前项目中的一些信息

2.3 方法注解@Bean

首先需要注意的是,方法注解@Bean需要与五大类注解一起搭配使用。通过@Bean可以获得该标注方法执行结束后返回的Bean对象。如下图:

  


2.4 Bean对象的默认命名规则

通过之前的学习我们知道,存储到Spring中的Bean对象要有一个唯一标识身份的Id信息,所以我们之后才能正确的获取到这个Bean对象。那么,我们在使用五大类注解时并不能指定这个id信息,这说明Spring是帮助我们来完成了这件事的。那么,Spring是按照哪种规则来命名的呢?为我们一起来翻看下源码:


 可以看到,当我们使用五大类注解时,Spring其实是将根据类的名称来进行这个类的对象的管理的。当类的是前两个字母都是大写时,直接以这个类名作为存储的bean对象的身份标识,否则将类的第一个字符转换为小写作为存储的bean对象的标识!下面我们来验证一下:


3. 读取Bean对象

从ioc容器中读取Bean对象又称为对象装配,有时候也叫做对象注入。总共有以下三种注入方式,均是通过@Autowired或者@Resource注解来实现的:

  1. 属性注入——@Autowired/@Resource
  2. 构造方法注入——@Autowired/@Resource
  3. Setter注入——@Autowired

其中,@Autowired注解可以用于标注 属性注入、Setter注入以及构造方法注入;而@Resource只能用于标注 属性注入和Setter注入,布恩那个用于标注构造方法注入!


下面我们通过将IOC容器中的服务层的UserService对象注入到IOC容器中的控制层的UserController对象中,并且在UserController对象中调用服务层的方法,来学习这三种注入读取Bean对象的方式——操作【1】


3.1 属性注入

实现:在类的成员属性上加上@Autuwired注解,表明该属性要被Spring注入。

我们来学习通过属性注入的方式实现上述操作【1】


3.2 setter注入

实现:在成员属性中定义注入对象引用,并为其添加setter方法,在setter方法上加上@Autowired注解表明要进行Setter注入操作。

我们来学习通过Setter注入的方式实现上述操作【1】


3.3 构造方法注入

实现:在当前类的构造方法上加上@Autowired注解,在形参上指定Spring要注入的对象及其类型,将该对象赋值给成员属性上的引用变量,完成构造方法注入。(当当前类中的构造方法只有一个时,可以省略构造方法上@Autowired注解的标注)

我们来学习通过构造方法注入的方式实现上述操作【1】


使用构造方法注入的注意事项:

  1. 用于实现构造方法注入的构造方法中的形参的参数只能注入对象一个!
  2. 当前注入类中有多个构造方法时,就不能省略@Autowired注解!

3.4 注入异常问题

使用上述的注入方式可能存在下边的这种问题:

当我们的ioc容器中存在了多个相同类型bean对象,再通过上方的注入方式来获取的话,程序就会报异常!我们来模拟一下这种情况以及记录这种情况的解决办法。


那么,应该如何解决上述的问题呢?

这个时候就需要我们的@Resource或者@Qualifier注解上场了!上述问题共分为以下两种情况来解决:


3.5 注入方式优缺点

Spring的依赖注入/对象装配有哪几种方式?它们之间有什么区别?

Spring共有三种依赖注入方式,分别是属性注入,Setter注入以及构造方法注入。它们之间的区别如下:

  1. 属性注入
    优点:书写简洁,使用方便。
    缺点:无法注入一个不可变对象(被final修饰的引用所引用的对象);只适用于IOC容器;并且比较容易违背单一设计原则。
  2. Setter注入
    优点:更加符合单一设计原则。
    缺点:依然不可注入不可变对象;由于Setter方法时public的,所以注入的对象可以被随时修改。
  3. 构造方法注入
    优点:可以注入不可变对象;并且只会在类加载时执行一次;注入对象会被完全初始化;当当前类中只有一个构造方法时 ,可以省略注解标注,通用性较好。

3.6 @Autowired和@Resource的区别

  1. 出身不同:@Autowired来自Spring,@Resource来自于JDK
  2. 使用时参数设置不同:@Resouce相对于@Autowired来说支持更多的参数配置。
    最常见的例如@Resource可以配置name属性来从ioc容器中获取Spring管理的对象,@Autowired则不能配置name属性。
  3. @Autowired可以用于三种注入方式属性注入、Setter注入以及构造方法注入中的任何一种,而@Resource只能用于属性注入和Setter注入标注。

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

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

相关文章

python web开发(二):HTML标签语言

文章目录 简介标签语法标题div和span超链接插入图片列表表格Input系列提交表单 参考 简介 如下展示了一段简单的HTML模板&#xff0c; <head></head>标签中主要包含一些基本配置&#xff0c;如编码方式&#xff0c;标题等&#xff0c;注意标题的作用如下图所示 …

【java BUG收集-持续更~】

JAVA BUG JAVA BUGliquibase.lockservice锁异常1、启动参数增加jvm参数 -Dliquibase.lockservicefalse2、修改或清空 包含有 DATABASECHANGELOGLOCK的表 JAVA BUG 该章收集工作中遇到的java bug,作为工作日志&#xff0c;方便回顾。 liquibase.lockservice锁异常 报错信息&a…

Spring Boot实用技巧之单元测试

文章目录 一、单元测试的概念二、单元测试的优势三、Spring Boot实现单元测试&#xff08;一&#xff09;添加依赖&#xff08;二&#xff09;生成单元测试的类&#xff08;三&#xff09; 添加注解和业务代码1. 添加 SpringBootTest 注解2. 添加单元测试的业务代码3. 执行测试…

MySQL部分常用函数总结

数值计算函数 使用方法&#xff1a; ABS&#xff08;x&#xff09; date函数 获取date中对应部分&#xff1a; YEAR(date) 字符串函数 用法举例&#xff1a; 左侧截取字符 SELECT LEFT(‘MySQL’,2); 按符号拆分字符&#xff0c;返回拆分后的部分 SUBSTRING_INDEX(profile,“…

创新洞察 |与众不同的DTC模式:2023年发展趋势将如何影响零售业增长策略?

DTC零售不再局限于数字原生品牌。传统零售商也在采用相同的策略&#xff0c;特别是在后疫情世界中竞争时。预计DTC销售将继续增长&#xff0c;因为更多品牌转向电子商务领域&#xff0c;而已建立的DTC参与者也在扩大其现有市场。预计仅在美国&#xff0c;数字原生品牌将在2023年…

多分类的ROC曲线绘制思路

目录 一、什么是ROC曲线 二、AUC面积 三、代码示例 1、二分类问题 2、多分类问题 一、什么是ROC曲线 我们通常说的ROC曲线的中文全称叫做接收者操作特征曲线&#xff08;receiver operating characteristic curve&#xff09;&#xff0c;也被称为感受性曲线。 该曲线有两…

第四节 Linux 特殊权限SUID、SGID、SBIT

目录 1.Set UID 简称 SUID 2.Set GID 简称 SGID 3.Sticky Bit 简称 SBIT 1.Set UID 简称 SUID 简称 SUID 限制与功能&#xff1a; SUID权限仅对二进制程序有效&#xff1b; 执行者对于该程序需要具有x的执行权限&#xff1b; 本权限仅在执行该程序的过程中有效&#xff1…

Softmax简介

Softmax是一种数学函数&#xff0c;通常用于将一组任意实数转换为表示概率分布的实数。其本质上是一种归一化函数&#xff0c;可以将一组任意的实数值转化为在[0, 1]之间的概率值&#xff0c;因为softmax将它们转换为0到1之间的值&#xff0c;所以它们可以被解释为概率。如果其…

VSCode +gdb+gdbserver远程调试arm开发板

一、下载编译器 从ARM官网下载gcc-arm编译器&#xff0c;编译器中自带gdb和gdbserver&#xff0c;可以省去自己编译。 注&#xff1a;gdb是电脑端程序&#xff0c;gdbserver是arm开发板程序 arm官网链接&#xff1a;https://developer.arm.com/downloads/-/arm-gnu-toolchain-d…

速卖通、Lazada、美客多、亚马逊新品流量如何利用测评快速提升?

熟悉亚马逊的卖家应该清楚&#xff0c;亚马逊对于新发布的产品会有一定的流量倾向&#xff0c;特别是产品刚上架的2-4周&#xff0c;你的产品将在搜索结果中显示更多&#xff0c;排名比通常情况下更快。 第一步&#xff1a;优化好自己的产品listing1.新品上架标题要点标题权重…

SLM27524一款能够有效驱动MOSFET和IGBT电源开关双通道低侧栅极驱动器

深力科电子为“数据中心服务器电源”推荐一款双通道大非反相低侧栅极驱动器 SLM27524&#xff0c;该产品能够有效驱动MOSFET和IGBT电源开关。SLM27524采用一种能够从内部极大地降低击穿电流的设计&#xff0c;将高峰值的源电流和灌电流脉冲提供给电容负载&#xff0c;从而实现了…

NDK OpenGL离屏渲染与工程代码整合

NDK​系列之OpenGL离屏渲染与工程代码整合&#xff0c;本节主要是对上一节OpenGL渲染画面效果代码进行封装设计&#xff0c;将各种特效代码进行分离解耦&#xff0c;便于后期增加其他特效。 实现效果&#xff1a; 实现逻辑&#xff1a; 1.封装BaseFilter过滤器基类&#xff0c…

C++ 多线程编程(四) 原子类型atomic

C 11增加了原子类型atomic类&#xff0c;在一定条件下可以实现无锁编程。 1. 简介 atomic是一个模板类&#xff0c;定义如下&#xff1a; template< class T > struct atomic; atomic可以实现无锁编程&#xff0c;在效率上要比mutex高很多&#xff0c;直接看个直观的…

有道云笔记常用快捷键

F5 同步/刷新 Shift AltD 插入当前时间&#xff1a; CTRL B 加粗 CTRL I 斜体字 CTRL U 下划线 CTRL E 删除线 CTRL D 任务框 CTRL 1 变成标题1 CTRL 2 变成标题2 CTRL 3 变成标题3 CTRL 4 变成标题4 CTRL G 高亮块 CTRL H 加水平线 当前行成无序列表&a…

npm安装依赖实践总结

node下载地址&#xff1a;https://nodejs.org/en/download/releases 。可以看到node版本、npm版本、node_module版本。 【1】npm的全局安装路径 查看默认值&#xff1a; npm get prefix默认是C:\Users\你的用户名\AppData\Roaming\npm 可以通过 npm config prefix 更改全局…

为什么PCB设计完成后需要放置mark点

PCB设计中的Mark点是指一些标记点&#xff0c;通常用于促进PCB制造和组装过程中的准确性和一致性。这些标记点在制造过程中可以帮助操作员进行自动化定位&#xff0c;从而确保所有部件都被正确组装到其正确位置&#xff0c;这对于确保产品的质量和可靠性至关重要。 下面&#…

springboot抵御即跨站脚本(XSS)攻击

抵御即跨站脚本(XSS)攻击 XSS攻击通常指的是通过利用网站系统保存系统的漏洞&#xff0c;通过巧妙的方法把恶意指令注入到网页&#xff0c;用户加载网页的时候会自动执行恶意脚本 比如&#xff1a; <script>alert(xss); </script> 如果客户能在你的浏览器执行j…

C# Setting.settings . 配置用法

1、定义 在Settings.settings文件中定义配置字段。把作用范围定义为&#xff1a;User则运行时可更改(用户范围的字段数据更改存储在用户信息中&#xff0c;不在该程序文件中)&#xff0c;Applicatiion则运行时不可更改。可以使用数据网格视图(VS软件的Properties 下面的Settin…

几何深度学习 - 利用几何先验知识的深度学习

深度学习很难。 虽然通用逼近定理表明足够复杂的神经网络原则上可以逼近“任何东西”&#xff0c;但不能保证我们可以找到好的模型。 尽管如此&#xff0c;通过明智地选择模型架构&#xff0c;深度学习取得了巨大进步。 这些模型架构对归纳偏差进行编码&#xff0c;为模型提供…

makefile 条件判断语句

文章目录 前言一、条件判断语句的语法说明二、ifeq / ifneq三、ifdef / ifndef代码讲解&#xff1a; 四、经典示例总结 前言 一、条件判断语句的语法说明 makefile 中支持条件判断语句。 可以根据条件的值决定 make 的执行。可以 比较 两个不同变量或者变量和常量值。 条件判…