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

通过上一章的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.mzph.cn/news/10032.shtml

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

相关文章

mysql通过binlog恢复数据

开启binlog 在my.ini中添加以下两行代码&#xff1a; log-binmysql-binserver-id1 注意要写在[mysqld]范围内才会生效 查看binlog存放日志文件目录 show variables like %datadir%; 查看binlog文件名 show master logs; 将binlog转换成sql mysqlbinlog --no-defaults --bas…

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II

文章目录 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维矩阵II⛅前言 滑动窗口最大值&#x1f512;题目&#x1f511;题解 搜索二维矩阵II&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维…

SpringMVC程序开发

1.什么是Spring MVC? Spring Web MVC是基于Servlet API构建的原始的Web框架&#xff0c;从一开始是就包含在Spring框架中。它的正式名称“Spring Web MVC"来自其源模板的名称&#xff08;Spring-webmvc)&#xff0c;但通常被称为“Spring MVC" 从上述的定义我们可…

[visionOS][Apple Vision Pro] 缩放3D模型

方法一&#xff1a;通过代码来设置Model3D Model3D(named:"你的3D模型名称",bundle:realityKitContentBundle).padding(.bottom,50).scaleEffect(0.2) //这句用来缩放 方式二&#xff1a;别人可以&#xff0c;我验证过不行的方法 RealityKitContent工具中&#xf…

PLC-Recorder的高速采集有多快?0.5ms算快吗?看控制器能力了!

大家知道&#xff0c;PLC-Recorder有一个高速采集的功能&#xff0c;基于TCP连接或UDP报文&#xff0c;速度取决于发送端的能力。对于西门子PLC&#xff0c;能做到1-2ms的采集速度&#xff0c;但是&#xff0c;我在前面的文章里提到了0.5ms的高速采集&#xff0c;哪个控制器能这…

Linux 下 nc 发送接收 udp、tcp数据

nc&#xff0c;全名叫 netcat&#xff0c;它可以用来完成很多的网络功能&#xff0c;譬如端口扫描、建立TCP/UDP连接&#xff0c;数据传输、网络调试等等&#xff0c;因此&#xff0c;它也常被称为网络工具的 瑞士军刀 。 一、只服务端使用nc 备注&#xff1a;这种方式只能发…

Django实现音乐网站 ⑴

使用Python Django框架制作一个音乐网站。 目录 网站功能模块 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 后台管理 创建管理员账户 启动服务器 登录网站 配置时区…

自媒体必备的8个素材网站,视频、音效、图片全部免费下载

自媒体必备的视频、音效、图片素材&#xff0c;这8个网站帮你解决。赶紧马住&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是一个设计网站&#xff0c;但它还有非常丰富的视频和音频素材&#xff0c;视频素材全部都是高清无水印&#…

Java 贪心算法经典问题解决

文章目录 分金条题目思路代码实现测试用例以及结果输出 花费资金做项目最大收益题目思路代码实现测试用例以及结果输出 预定会议室题目思路代码实现测试用例以及结果输出 取中位数题目思路代码实现测试用例以及结果输出 最低字典序题目思路代码实现测试用例以及结果输出 结语 分…

vite打包性能优化以及填坑

目录 前言 项目优化前 分析 优化 拆分包 去除debugger CDN 加速 按需导入 文件压缩 图片压缩 viteImagemin报错 填坑 坑1 坑2 总结 配置 前言 最近在使用 Vite4.0 构建一个中型前端项目的过程中&#xff0c;遇到了一些坑&#xff0c;也做了一些项目在构建生产环…

C进阶:文件操作

C语言文件操作 什么是文件 磁盘上的数据是文件。 但是在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件&#xff08;例如.c,.h这一类编译&#xff0c;链接过程中的文件&#xff09;&#xff0c;数据文件。 程序文件 包括源程序文件&#xff08;后缀为.c&…

重生之我要学C++第四天

这篇文章的主要内容是类的默认成员函数。如果对大家有用的话&#xff0c;希望大家三连支持&#xff0c;博主会继续努力&#xff01; 目录 一.类的默认成员函数 二.构造函数 三.析构函数 四.拷贝构造函数 五.运算符重载 一.类的默认成员函数 如果一个类中什么成员都没有&…

JavaWeb 速通HTTP

目录 一、HTTP快速入门 1.HTTP简介 : 2.HTTP请求头 : 3.HTTP响应头 : 二、HTTP响应状态码 1.基本介绍 : 2.常见状态码 : 3.状态码的分类 : 4.完整状态码汇总 : 三、HTTP请求包和响应包 1.请求包分析 : 1 GET请求 (1) 说明 (2) doGet返回数据给浏览器 (3) form表单提…

Hadoop生态体系-2

目录标题 1、MapReduce介绍2、数据仓库3、HIVE4、HQL4.1 hive读写文件机制4.2 Hive数据存储路径 1、MapReduce介绍 思想&#xff1a;分而治之 map:“分”&#xff0c;即把复杂的任务分解为若干个“简单的任务”来处理。可以进行拆分的前提是这些小任务可以并行计算&#xff0c…

C++ 函数重载

1.函数重载的概念 在C中可以为两个或两个以上的函数提供相同的函数名称&#xff0c;只要参数类型不同&#xff0c;或参数类型相同而参数个数不同&#xff0c;称为函数重载。 在C语言中实现int&#xff0c;char&#xff0c;double类型的比较大小函数&#xff1a; int my_max_…

【Kubernetes资源篇】ingress-nginx最佳实践详解

文章目录 一、Ingress Controller理论知识1、Ingress Controller、Ingress简介2、四层代理与七层代理的区别3、Ingress Controller中封装Nginx&#xff0c;为什么不直接用Nginx呢&#xff1f;4、Ingress Controller代理K8S内部Pod流程 二、实践&#xff1a;部署Ingress Control…

STM32 串口实验(学习一)

本章将实现如下功能&#xff1a;STM32通过串口和上位机对话&#xff0c;STM32在收到上位机发过来的字符串后&#xff0c;原原本本返回给上位机。 STM32 串口简介 串口作为MCU的重要外部接口&#xff0c;同时也是软件开发重要的调试手段&#xff0c;其重要性不言而喻。现在基本…

KMP算法的及其原理

KMP算法 首先 我们先了解一下 KMP算法的作用 str1 和str2 字符串 如果str1中包含str2 那么返回头位置 如果不包含返回-1 首先 我们先加入一个概念: 有一个next数组 next[i]的值为 str2 中 以i-1位置为结尾的字符串中 最长相同前缀后缀为多长(相同前缀后缀 不是对称 aba 中相…

uniapp 小程序如何从主包页面跳转到分包页面

在uniapp开发小程序的时候&#xff0c;“分包”概念一定要提前了解下&#xff0c;具体我就不多说了&#xff0c;自己看下关网的相关配置。 那么&#xff0c;如果从主包页面&#xff0c;跳转至分包的页面呢&#xff1f;如图所示 我的页面->详情页 在我的页面创建好自己的链…

ARM--LED灯点亮

LED1,LED2,LED3亮灯 .text .global _start_start: /**********LED1点灯--->PE10**************//*初始化RCC章节*/通过RCC_MP_AHB4ENSETR寄存器,使能GPIOs组控制器 0x500000A28[4] 1RCC_INIT: E组和F组一起使能ldr r0,0x50000A28 ldr r1,[r0]orr r1,r1,#(0x3 << 4)s…