Spring(二):更简单的存储与读取 Bean

news2024/11/25 2:29:00

通过上一章的Spring,我们基本实现了Spring 的读取与存储,但是在操作过程中,读取与存储并没有那么得“简单” 一套流程还是很复杂,所以,本章来介绍更加简单得读取与存储。

在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解,也就是我们接下来要学习 Spring 中的相关注解,来存储和读取 Bean。

更简单的存

之前我们存储 Bean 时,需要在 spring-config 中添加⼀⾏ bean 注册内容才⾏:

 我们现在可以通过写一行注解就代替一行 配置。

配置扫描路径

如果这缺少了这个前置工作,那么整个项目的操作都操作不起来。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
       <content:component-scan base-package="com.java.Repository">
       </content:component-scan>

</beans>

这个扫描路径就是去扫描 该路径底下是否加了 “五大” 注解,一经发现注解,就给他添加到 Spring(容器) 中。

如果不是在该扫描路径底下,即使是加了扫描路径,也不会加入到Spring 中。

所以,这个配置的扫描路径需要格外注意,不能太大,太大就会导致项目启动的很慢,太小又会导致添加不到。

添加注解存储 Bean 对象

想要将对象存储在 Spring 中,有两种注解类型可以实现:
  1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration。
  2. ⽅法注解:@Bean。

举个栗子:

通过这个 注解就可以 将对象存储到 Spring 中

当然,存储的前提是 路径配置正确。

其他的四个注解也一样,这里就不一一举例了。

看看结果:

 这里首字母小写不完全正确,到获取的 部分再来讲解。

为什么要这么多类注解?

就是让程序员看到类注解之后,就能直接了解当前类
的⽤途,⽐如:
  • @Controller:表示的是业务逻辑层;
  • @Servie:服务层;
  • @Repository:持久层;
  • @Configuration:配置层
程序的⼯程分层,调⽤流程如下:

类注解之间的关系  

 我们通过查看源码可以知道:

查看 @Controller / @Service / @Repository / @Configuration 等注解的源码发现:
其实这些注解⾥⾯都有⼀个注解 @Component,说明它们本身就是属于 @Component 的“⼦类”。

Bean注解

除了五大类注解,还可以通过 Bean 注解(这个Bean 注解不是类注解,而是方法注解):
我来看看单单只有一个 Bean 注解是无法注入进 容器中 ,
Bean 在使用的前提是必须配合五大类注解,才可以生效
 

更简单的取

这个取,主要就是针对这个 Bean 来取

上述过程中,这个通过默认名去取的会产生问题,

现在这个方法名叫做 UUUU 我们再来使用刚刚首字母小写的方式,看看能不能拿到:

我们发现它找不到这个 对象了。为啥呢?

我们来看看Bean生成名称的源码:

我们可以发现,如果是首字母和第二个字母都大写的话 需要直接返回它的原名。

当然,我们在Bean 注解之后还可以加上名字:

获取 Bean 对象

 获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊

对象装配(对象注⼊)的实现⽅法以下 3 种:
  1.  属性注⼊
  2.  构造⽅法注⼊
  3.  Setter 注⼊
接下来,我们分别来看

属性注入

举个例子

在Users 类中添加了 user1 的方法,返回值是User。

 

最终是可以获取到User对象。

 解释:这里将 Users 这个类注入到了 Spring 容器中,并且还将 user1 这个方法注入到了容器中,它返回的对象 是 User 这个类。 所以可以在后续拿到 User 对象。怎么拿的,就是通过 Autowrid 这个注解(这就是属性注入)。

假设,我们给他再次注入一个 User 对象至容器中,看看还能不能再次属性注入成功

 反而还报错,容器中注入了 两个 返回对象为 User 的,它并不知道你具体需要哪个。

我们大致可以推测 Spring 容器存储Bean 对象的逻辑:

@Bean 对象注意事项 

如果多个Bean 对象使用相同的名称,那么程序就会报错,但是第一个 Bean 对象之后的对象不会被放到容器中,也就是只有在第一次创建Bean 对象的时候,会将对称和 Bean 名称关联起来,后续在有相同的名称的 Bean 存储的时候,容器会自动忽略。

那么要如何来拿到呢?

我们有如下几种方法:

方法一:在容器中存储不以默认的名字为主,给他手动添加一个 名字,此后就用手动添加的名字

 方法二:使用 Qualifier 这个注解,指定 需要找的User 对象

属性注入的特点:

优点:

  1. 使用简单,直接就可以通过 Autowried 注入

缺点:

  1. 无法注入 final 修饰的类,final 的特征:要么直接复制,要么在构造方法中赋值
  2. 通用性问题:只能适用于 IoC容器,如果是非 IoC 容器,只有在使用时才会报 空指针异常。
  3. 更容易违背单一设计原则,因为使用起来比较方便

Setter 注入

Setter 注入不过就是将 之前的属性改成了一个 set 方法:

Setter注入的特点:

 优点:

  1. 通常 Setter 只 Set 一个属性,所以 Setter 注入 更加符合单一设计原则

缺点:

  1. Setter 注入 的对象可以被修改,setter 本来就是一个方法,既然时一个方法,那么就可能被多次调用和修改

构造方法注入

构造方法注入是 Spring 4.0 之后推荐的注入方法

 构造方法注入的特点:

优点:

  1. 可以注入一个final 修饰的变量
  2. 注入的对象不会被修改,因为 构造方法只加载一次
  3. 构造方法注入可以保证诸如对象完全初始化
  4. 构造方法注入通用性更好

缺点

  1. 写法比属性注入复杂
  2. 使用构造方法注入无法解决循环依赖的问题(这里涉及到 Spring 三级缓存,以后再说)

@Resource 另一种关键字

除了 @Autowired 还有一个 注解

 我们可以看到它来自于 Java 拓展类

并且它不能作用在构造方法上:

@Autowired 和 @Resource 的区别

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

总结

1. 将对象存储到 Spring 中:

  • a. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它们之间的关系】
  • b. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】

2. Bean 的命名规则:

  • ⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。

3. 从 Spring 中获取对象:

  • a. 属性注⼊
  • b. Setter 注⼊
  • c. 构造函数注⼊(推荐)

4. 注⼊的关键字有:

  • a. @Autowired
  • b. @Resource

5. @Autowired 和 @Resource 区别:

出身不同; 使⽤时设置参数不同 @Resource ⽀持更多的参数,⽐如 name
 

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

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

相关文章

【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

author&#xff1a;&Carlton tag&#xff1a;C topic&#xff1a;【C】继承基础知识及简单应用&#xff0c;使用reportSingleClassLayout&#xff08;在Visual Studio开发人员命令提示窗口&#xff09;查看派生类详细信息 website&#xff1a;黑马程序员C date&#xf…

MySQL 读写分离

目录 一、什么是读写分离&#xff1f; 二、为什么要读写分离呢&#xff1f; 三、什么时候要读写分离&#xff1f; 四、主从复制与读写分离 五、MySQL 读写分离原理 六、企业 使用MySQL 读写分离场景 1&#xff09;基于程序代码内部实现 2&#xff09;基于中间代理层实现…

比selenium体验更好的ui自动化测试工具: cypress介绍

话说 Cypress is a next generation front end testing tool built for the modern web. And Cypress can test anything that runs in a browser.Cypress consists of a free, open source, locally installed Test Runner and a Dashboard Service for recording your tests.…

【yolov7】训练自己的数据集-实践笔记

【yolov7】训练自己的数据集-实践笔记 使用yolov7训练自己的数据集&#xff0c;以RSOD数据集为例&#xff0c;图像数量976&#xff0c;一共四类。 yolov7源码&#xff1a;https://github.com/WongKinYiu/yolov7 同时在该网址下载好预训练文件&#xff0c;直接放到yolov7-main…

【每日随笔】马太效应 ② ( 马太效应因果分析 | 规模效应 | 齿轮效应 | 资源优势 | 抗风险能力 | 领先效应 )

文章目录 一、规模效应二、齿轮效应三、资源优势四、抗风险能力五、领先效应 在本文中 , 分析马太效应产生的原因 ; 一、规模效应 自然界中的规模效应 : 体型庞大的动物 , 如 大象 , 犀牛 , 雄狮 , 河马 , 很少被弱小的动物击败 , 都是自然死亡 , 老死 , 病死 , 同类厮杀 ; 经济…

多源BFS-- 矩阵距离

关于多源BFS&#xff0c;基本上就是单源BFS的简单升级了一下&#xff0c;比如在queue中队头开始时只有一个&#xff0c;我们通过这一个队头去推导其他的东西。而多源最短路就是队头一开始有1-n个可能的数&#xff0c;一个一个去BFS。 题目思路&#xff1a; 这个题就直接把所有的…

苹果开发“Apple GPT”AI科技迎来新格局

根据彭博社的马克・古尔曼&#xff08;Mark Gurman&#xff09;报道&#xff0c;苹果内部正在开发“Apple GPT”人工智能项目&#xff0c;足以媲美 OpenAI 的 ChatGPT &#xff0c;预计明年推出。就在彭博社消息发出之后&#xff0c;苹果股价上涨了2.3%&#xff0c;市值顶峰时增…

深入解析 Kubernetes 架构:掌握主节点、工作节点和容器运行时

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【Linux后端服务器开发】协议定制(序列化与反序列化)

目录 一、应用层协议概述 二、序列化与反序列化 Protocal.h头文件 Server.h头文件 Client.h头文件 server.cpp源文件 client.cpp源文件 一、应用层协议概述 什么是应用层&#xff1f;我们通过编写程序解决一个个实际问题、满足我们日常需求的网络程序&#xff0c;都是应…

CMU15-445 2022 Fall 通关记录 —— Project 3:Query Execution(上篇)

前言 我在初次实现的时候并没有做 三个“选做”的排行榜任务&#xff0c;所以这只是上篇内容&#xff0c;等完成 Pro4 后再完成下篇。 Project 3: Query Execution Project #3 - Query Execution | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) — 项目 #3 - 查…

R语言机器学习之影像组学分析的原理详解

概要 影像组学从常规医学图像中高通量提取大量的放射学定量数据&#xff0c;并以非侵入性方式探索它们与临床结果的相关性&#xff0c;在医学研究中得到广泛的应用。 01 影像组学&#xff08;Radiomics&#xff09;的概念&#xff1a; 影像组学&#xff08;Radiomics&#xff…

JVM堆内存介绍

一&#xff1a;JVM中内存 JVM中内存通常划分为两个部分&#xff0c;分别为堆内存与栈内存&#xff0c;栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址。 JVM全部的对象信息都 存放在堆内存中。相比栈内存&#xff0c;堆内存能够所大的多&am…

图为科技应邀出席第38届中国计算机应用大会

第38届中国计算机应用大会&#xff08;CCF NCCA 2023&#xff09;暨2023年人工智能应用学术会议于7月16日-19日在苏州召开。 本次会议由中国计算机学会(CCF)主办&#xff0c;CCF计算机应用专业委员会承办&#xff0c;苏州大学、苏州科技大学、南京理工大学等单位协办&#xff0…

数字孪生搭高台,温控节能唱新戏

“孪生”的基本思想最早起源于1969年的阿波罗计划&#xff0c;通过留在地球上的航天器对发射到太空的航天器进行工作状态的仿真模拟&#xff0c;进而辅助航天员完成决策&#xff0c;减少各种操作结果的未知性。 从2002年开始&#xff0c;数字孪生的概念和定义在不同领域逐渐被提…

三种数据库架构模式

数据架构设计模式 数据架构主要有三种模式&#xff1a; Shared Everything、Shared Disk、Shared Nothing。 Shared Disk 各处理单元使用本地的私有CPU和Memory&#xff0c;共享磁盘系统&#xff0c;分布式数据库。 典型的代表是Oracle RAC、DB2 PureScale。 例如&#xf…

Navicat远程连接服务器失败 2002 - Can‘t connect to server on ...(10060)

报错如下&#xff1a; 2002 - Can’t connect to server on ‘192.168.33.59’(10060) 解决方案&#xff1a; 下面列举可能出现的几种情况&#xff1a; 1.防火墙原因&#xff0c;需要关闭防火墙 systemctl stop firewalld systemctl disable firewalld2.数据库未开启&#x…

基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树

目录 1.算法理论概述 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 情绪识别是一种重要的情感分析任务&#xff0c;旨在从文本、语音或图像等数据中识别出人的情绪状态&#xff0c;如高兴、悲伤、愤怒等。本文介绍一种基于…

Linux软件/系统看门狗嵌入式独立看门狗

updating linux看门狗的使用 freertos看门狗的使用 一、看门狗简介 看门狗,又叫Watchdog timer(看门狗定时器)是一种电子计时器,其用于检测和恢复计算机故障。一般有一个输入和一个输出,其中的输入叫做喂狗( kickingthe dog or service the dog)。输出一般连接到另外一个部…

HP暗影精灵9 Plus OMEN 17.3英寸游戏本17-ck2000出厂Win11系统原厂预装OEM系统

惠普暗影9笔记本电脑原装Windows11系统ISO镜像包 适用机型17-ck2000TX,17-ck2001TX,17-ck2002TX,17-ck2003TX 自带所有驱动、出厂主题壁纸LOGO、Office办公软件、惠普电脑管家、OMEN Command Center等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;IS…

软件外包开发可行性调研

软件开发的可行性调研对软件工程来说是必要的&#xff0c;也是开启软件工程建设的第一步。在进行软件外包开发的可行性调研时&#xff0c;需要调查的内容比较多&#xff0c;同时调查研究并不是一次性完成的任务&#xff0c;而是一个持续过程&#xff0c;应随着项目进行进行调整…