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

news2024/10/6 2:19:54

在spring的创建和使用这篇博客中有讲到关于Spring存储和读取Bean对象的操作,但是细心的朋友有没有发现那些操作没有想象中的简单呢?所以呀,我今天要给朋友分享的是更简单的存储和读取Bean对象的方法,快来看看吧~

 

在Spring中想要更简单的存储和读取对象的核心就是使用注解,这就是我接下来要给朋友讲的啦

讲注解之前,先要在配置文件中添加扫描路径.

目录

1、存储Bean对象

1.1 配置扫描路径

1.2 添加注解存储Bean对象

1.2.1 @Controller(控制器存储)

1.3 各类注解的含义

1.4 方法注解

1.4.1 方法注解需要配合类注解使用

1.4.2 重命名Bean

2. 获取Bean对象

2.1 属性注入

2.2 setter注入

2.3 构造方法注入

2.4 @Resource


1、存储Bean对象

想要将对象成功的存储到Spring中,我们需要先配置一下存储对象的扫描包路径,只有被配置了的包下的所有类,添加注解后才能被正确的识别并保存到Spring中.

1.1 配置扫描路径

在 spring-config.xml (此文件为resources目录下自己创建的一个xml文件)中添加如下配置:

 这一步很重要,因为即使添加了注解,但如果不是在配置的扫描包下的类对象,仍然是不能被存储到Spring中的.例如上图,只要是在com.zl包下的加了注解的类的对象都可以被存储到Spring中.

1.2 添加注解存储Bean对象

若想将Bean对象成功存储到Spring中,有两种类型的注解可以实现:

  • 类注解:@Controller,@Service,@Repository,@Component,@Configuration.
  • 方法注解:@Bean

1.2.1 @Controller(控制器存储)

使用@Controller存储bean的代码如下所示:

读取并使用Bean:

运行APP类,得到一下结果:

 以上是五大类注解中@Controller的使用方法,其他四大注解的使用方法与之相同.在这里就不一一演示了.但是现在可能朋友你就要问了,为什么使用方法一样,用一个就好了呀,但是要有这么多类注解呢,接下来我们来看.

1.3 各类注解的含义

为什么要有这么多种类注解,这就和自己的身份证号的前两位一样,比如北京市的身份证号前两位就是11,河北省的前两位是13,湖北省的前两位42等,每个省的身份证号的其两位都不同,这样做的最大的作用就是可以直观的标识这个身份证所处的归属地.

同样这也是为什么需要这么多类注解一样,就是为了方便程序员看到类注解之后,就能直接了解当前类的用途,以下是这些类注解所要传达给程序员的信息:

@Controller:控制类,业务逻辑层,主要验证前端发过来的参数

@Servie:服务类,服务层,数据的处理和接口的调用

@Repository:仓库类,持久层,主要是对数据库的操作,也叫作Dao类

@Configuration:配置类,一些主要负责配置信息的类

@Component:组件类,一些外部实现的工具类

程序的工程分层,调用流程如下:

 注:@Component是其他四类类注解的"父类".

1.4 方法注解

类注解是添加在某个类上的,而方法注解是添加到某个方法上的,以下是代码实现:

然后我们在主函数上调用一下bean对象中的user方法,代码如下:

运行一下代码,发现报错,为什么呢?我们来看一下报错信息:

 通过报错信息我们可以发现,user找不到,为什么呢,是因为UserController这个类对象没有添加类注解,所以就没有存储到Spring中,所以自然就不能调用这个对象的方法了,所以,我们还要在类上添加一个类注解. 

1.4.1 方法注解需要配合类注解使用

在Spring框架的设计中,方法注解@Bean需要结合类注解才能将对象正常的存储到Spring容器中,如下图代码所示:

我们再来运行一下,得到以下结果:

这样就达到了我们的预期结果.

 通过以上例子我们得出一个小小的结论:类注解需要与方法注解搭配使用.

1.4.2 重命名Bean

可以通过name属性给Bean对象进行重命名操作,如下代码所示:

然后我们使用user1就可以获取到User对象了,如以下代码所示:

另外,这个重命名的name其实是一个数组,一个bean可以有多个名字,代码如下:

以上写法的话,不论我们是用 user1 还是 user2 都可以获取到User对象了,但是一旦重命名后,就不能写原来的user了.

补充:重命名时,name={}是可以省略的,就像这样:

@Bean("user1")
@Bean({"user1","user2"})

以上两种重命名的格式都是对的

2. 获取Bean对象

获取Bean对象也叫装配,是把对象取出来放到某个类中,也叫作对象注入.

对象注入的实现方法有以下3种:

  • 属性注入
  • 构造方法注入
  • Setter注入

下面我将仔细讲解一下这三种注入方式,按照实际开发中的模式,将 Service 类注入到 Controller 类中

2.1 属性注入

属性注入是用 @Autowired 实现的,将 Service 类注入到 Controller 类中.

Service 类的实现代码如下:

 

Controller 类的实现代码如下:

 获取Controller中的getUser方法:

 运行结果如下:

 

 属性注入的核心实现为:

属性注入的优缺点分析:

优点: 写法精简,可读性高

缺点: 首先官方就不推荐使用, 专业版 IDAE 会报警告提示.

  • 功能方面: 无法注入一个被 final 修饰的对象;容易引起空指针异常​​​​​​     
  • 通用性方面: 只适用于 IoC 容器
  • 设计原则方面: 更加容易违背单一设计原则

无法注入一个被 final 修饰的对象​​​​​​ :

这与java中的语法有关,因为对于被final修饰的对象,只有两种方式对其进行赋值,

  • 在声明时直接赋值
  • 通过构造方法赋值

容易引起空指针异常:

 只适用于 IoC 容器:

属性注入的方式只适用于 IoC 容器,  在非 IoC 框架中使用不了, 可移植性不高, 所以属性注入的通用性不是很好.

 更加容易违背单一设计原则:

因为属性注入的写法相对来说较为简单,就容易引起这种注入方式的滥用,所以更容易违背单一性原则.但是并不是说一定会违背,只是有这个可能.

2.2 setter注入

setter注入的核心实现为:

Setter注入优缺点分析:

优点:Setter 注入完全符合单一设计原则, 一个 Setter 方法只针对一个对象.

缺点:

  • 不能注入final修饰的对象
  • 注入的对象有被修改的风险

不能注入final修饰的对象:

原因和属性注入一样,final修饰的对象要么直接赋值,要么在构造方法中赋值.

注入的对象有被修改的风险:

因为 Setter 注入提供了 setXXX() 方法, 就意味着 setXXX() 可以被调用,  既然能被调用, 则 Setter 注入的对象随时都有被修改的风险.

2.3 构造方法注入

构造方法注入的核心实现为:

注意:如果只有一个构造方法,则@Autowired可以省略.如果有多个构造方法,则必须在需要注入的构造方法上加入@Autowired表明哪一个是需要被注入的.另外只能注入一个构造方法,因为在普通程序中,我们创建new一个对象时,会根据参数调用其中一个构造方法.

构造方法优缺点分析:

优点:首先它是当前Spring的推荐写法

  1. 可以注入不可变对象
  2. 注入的对象不会被修改
  3. 依赖对象在使用前一定会被完全初始化
  4. 通用性更好

缺点:写法较为复杂,如果注入对象很多,则代码看起来更臃肿.

可以注入不可变对象:

上面有讲到,被final修饰的属性可以通过构造方法赋值,故在构造方法注入时,可以给final对象赋值

注入的对象不会被修改:

构造方法注入, 在程序执行的时候, 它只会执行一次, 所以不会像 Setter 注入那样被调用多次, 也就不存在被修改的情况.

依赖对象在使用前一定会被完全初始化:

因为我们要注入的对象是在构造方法中实现的,构造方法的执行比类的创建要早, 所以我们要使用的注入的对象, 一定是被完全初始化的.

通用性更好:

构造方法是 JDK 支持的,  往往越底层的框架, 它的可移植性就越好, 所以换做其他任何框架都是适用的.

2.4 @Resource

在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊,如 下代码所示:

 @Autowired 和 @Resource 的区别:

  • 来源不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
  • 使用时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean.
  • @Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注 ⼊和属性注⼊,不能⽤于构造函数注⼊。

同一类型对应多个Bean时,如何注入自己想要的Bean?

比如当出现以下多个Bean,返回同一对象类型时程序会报错,如下代码所示:

 

在另一个类中获取User对象,如下:

 

 

执行以上程序:

报错原因:非唯一的Bean对象。

那怎么解决呢?有以下两种方法:

对于同一类型多个Bean报错处理:

  • 使⽤ @Resource(name="user1") 定义。
  • 使⽤ @Qualifier 注解定义名称

1)、使⽤ @Resource(name="user1") 定义:

 2)、使⽤ @Qualifier(需要搭配@Autowired)

 两者的运行结果都是:

这样问题就解决了~


 好啦,到这里就结束啦,回顾一下,五大类注解分别是什么以及他们之间各自起到的标识作用是什么,怎样存储对象、从Spring中获取对象的方式有哪几种,分别怎么获取,这几种方式的优缺点又是什么呢?相信认真看完这篇博客的朋友你应该知道了吧,要是回答不上来,那就再看一下吧

 

还有,有什么不理解的地方或建议或错误都欢迎指出哦,评论区私信都可~~~

 

 

 

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

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

相关文章

蓝牙学习四(广播)

1.简介 什么叫做广播,顾名思义就像广场上的大喇叭一样,不停的向外传输着信号。不同的是,大喇叭传输的是音频信号,而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息,就是将数据编码,调制到射频信号中发…

cmake使用

1. cmake概述及例子 CMake快速入门 cmake、qmake、cl之间关系 1.1 各种cmake cmake根据CMakeLists.txt生成makefile,make根据makefile行编译。 1.1.1 最简cmake:生成可执行程序(一个文件) #CMakeLists.txt cmake_minimum_req…

【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十章 LCD触摸…

第十一章 建立语义化版本并提交组件库到NPM仓库

语义化版本是这样规定的。 版本格式:主版本号.次版本号.修订号(MAJOR.MINOR.PATCH),版本号递增规则如下: 主版本号:当你做了不兼容的 API 修改;次版本号:当你做了向下兼容的功能性…

springboot+vue毕业生离校系统

目 录 摘 要 I 目 录 III 第1章 概述 1 1.1 研究背景 1 1.2 研究现状 1 1.3 研究内容 2 第二章 开发技术介绍 2 2.1 系统开发平台 2 2.2 平台开发相关技术 3 2.2.1 B/S架构 3 2.2.2 Java技术介绍 4 2.2.3 mysql数据库介绍 4 2.2.4 …

盘点程序员的花式赚外快的骚操作

2022世界杯比赛难得如期开幕了,卡塔尔王子的表情包想必大家已经看到眼晕。 我拿2200亿和你玩,你踢一个0:2过不过分啊~ 现实中的投资可不比卡塔尔王子的表情包失落更多,毕竟投资有风险入行需谨慎。 然而悲惨的事实是,…

[附源码]SSM计算机毕业设计新生入学计算机配号系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

企业若要实现预期广告推广效果,必须做好这六个步骤

在网络营销中,软文营销是一种最常用的营销手段。 我们知道,很多公司都是用软文进行广告推广。 然而,许多公司都觉得,软文营销并不是一件容易的事情,因为它不仅要有高品质的内容,还要有一定的操作能力&#…

CAD最常用的快捷键大全来啦

CAD快捷键的使用能够让我们加快画图的速度,但是想想CAD中有那么多的功能命令,所以CAD快捷键是很多的,想要完全记住是不可能的,这里就总结了常用的CAD快捷键命令,可能不全但是很实用。 一、常用绘图快捷键 最基本的一…

低代码与mes生产管理系统:功能篇

随着信息技术的发展和应用,信息系统在企业中的使用也越来越广泛。不仅可以使企业内部和企业间的信息流通更为便捷和频繁,同时可以提高管理的水平,有助于提高企业的生产效益。其中mes生产管理系统就是美豳的调查资询公司AMR(Advanced Manufacturing Resea…

牛顿法,高斯牛顿法,列文伯格-马夸尔特(LM)法

文章目录一:牛顿法 (Newtons method)1:概述2:牛顿方向与牛顿法3:牛顿法的基本步骤4:举例二:高斯牛顿法 (Gauss–Newton algorithm)1:概述2&#x…

若依、多选框前后端处理,MyBatis处理多对多关系

背景 很经典的CRUD&#xff0c;整理下笔记。 后端 实体类 /*** 专业方向主键&#xff0c;用于下拉框搜索*/private Long disasterTypeId;/*** 专业方向*/private List<DisasterType> disasterType;业务层 /*** 新增专家信息库** param expertInfo 专家信息库* return 结…

mac pro M1(ARM)安装:php开发环境

0. 引言 最近在处理各个语言的加密算法&#xff0c;正好需要安装php环境&#xff0c;特此记录&#xff0c;以供后续参考 1. 安装php 1、安装php包管理工具composer brew install composer2、安装php brew install php # 同时可以指定版本安装 brew install php8.0 # 查…

基于Java+SpringBoot+Mybatis+Vue+ElementUi的航空公司电子售票系统

项目介绍 本系统是利用Spring Boot框架而设计的一款结合用户的实际情况而设计的平台&#xff0c;前端利用VUE技术开发&#xff0c;将可供教师和管理员来使用的所有界面来显示出来&#xff0c;利用Java语言技术来编程实现用户和管理员所执行的各类操作业务逻辑&#xff0c;以My…

在MacOS上实现两个网络调试助手的UDP通信测试

文章目录一、背景二、网络调试助手软件三、UDP通信过程一、背景 因为有一个项目要中会使用本机中两个应用程序之间的UDP通信。 因此本文记录一下怎么在MacOS上实现两个网络调试助手的UDP通信测试。 二、网络调试助手软件 我使用的网络调试助手软件是&#xff1a;网络调试助…

Revit 中参数化多边形的画法?

Revit 中参数化多边形的画法 问题提出 :在 Revit 中&#xff0c;系统画多边形的命合都无法参数化&#xff0c;网上有“六边形”参数化的画法教学 ( 这个教学被收入《每日一技》第 76期“Revit 中族编辑时可控六边形的画法详解”)&#xff0c;却对任意多边形无可奈何。 网上及前…

Spring-全面详解(学习总结---从入门到深化)

目录 Spring简介 Spring体系结构 IOC_控制反转思想 IOC_自定义对象容器 IOC_Spring实现IOC IOC_Spring容器类型 ​ 容器实现类 IOC_对象的创建方式 使用构造方法 使用工厂类的方法…

少儿编程 电子学会图形化编程等级考试Scratch一级真题解析(判断题)2022年9月

2022年9月scratch编程等级考试一级真题 判断题(共10题,每题2分,共20分) 26、一个角色只能包含一个造型 答案:错 考点分析:考查角色造型,一个角色可以有多个造型,所以错误 27、我们可以根据需要将角色的任意一点设为造型中心 答案:对 考点分析:考查角色造型,角色…

CC1310F128RSMR Sub-1GHz射频微控制器 - MCU 433MHz 868MHz 915MHz ULP Wireless MCU

CC1310F128RSMR Sub-1GHz射频微控制器 - MCU 433MHz 868MHz 915MHz ULP Wireless MCU CC1310设备是德州仪器公司生产的一款性价比高、超低功耗、Sub-1GHz射频设备,这是SimpleLink的一部分,微控制器&#xff08;MCU&#xff09;平台。该平台包括Wi-Fi&#xff0c;蓝牙低能耗&am…

世界杯中隐藏的IoT物联网黑科技

世界杯首个大冷门上演&#xff01;&#xff01;夺冠热门阿根廷竟然一比二输给了沙特队&#xff0c;实在让人始料未及&#xff0c;让不少球迷都在黯然神伤。 回过头看&#xff0c;上半场4粒进球&#xff0c;被判越位无效的有3粒。整场比赛累计7次越位判罚&#xff0c;超过了上届…