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

2023-11-08

通过上一章的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
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring(二):更简单的存储与读取 Bean 的相关文章

随机推荐

  • 写给我的2015—开启工作新旅程

    前沿 2015年的总结相比2014年来的晚了许多 原因一方面是今年呀的发现CSDN竟然没有了前两年写年终的活动 另一方面嘛还是自己太懒散了 一直恍恍惚惚的没有下手来总结 今天 在这小年夜里 ps 外面下完雪挺冷的 独自一个人坐在办公桌前 静
  • 实心球体内部电势计算公式_均匀带电球体中心点电势怎么求

    展开全部 公式 q 其中 为电势能 q为电荷量 为电势 即 q 均匀带电球内的电场分布和距离球心的距32313133353236313431303231363533e4b893e5b19e31333431363565离r成正比 解析 由于正
  • linux文件权限查看及修改-chmod ------入门的一些常识

    查看linux文件的权限 ls l 文件名称ULUitugULUitug查看linux文件夹的权限 ls ld 文件夹名称 所在目录 ULUitugULUitug修改文件及文件夹权限 ULUitugULUitugsudo chmod 代表类
  • 【软件工程】内聚

    概念 是指一个模块内部个成分之间相互关联程度的度量 也就是说 凝聚是对模块内各处理动作组合强度的一种度量 很显然 一个模块的内聚越大越好 偶然凝聚 一个模块内的各处理元素之间没有任何联系 只是偶然地被凑到一起 这种模块也称为巧合内聚 内聚程
  • MySQL数据库引擎InnoDB和MyISAM的区别?

    数据库引擎InnoDB和MyISAM的区别 1 MyISAM不支持事务 InnoDB支持事务 2 MyISAM支持全文索引 InnoDB在MySQL5 6之前不支持 3 MyISAM不支持外键 InnoDB支持外键 4 MyISAM只支持表
  • STM32之flash的读写

    本文内容 本实验主要介绍Flash地址空间的数据读取 一 创建STM32CUBEMX工程 芯片选择F103C8 配置定时器 打开外部时钟 配置时钟 配置PC13为output对应板子上的LED 设置堆栈大小为4K 导出 二 KEIL下的配置
  • Vue 3 第七章:computed计算属性

    文章目录 1 Vue3中的computed函数 1 1 什么是computed 1 2 如何定义computed 1 3 computed函数的使用场景 1 3 1 过滤和排序 1 3 1 数组计算 2 computed函数的原理 总结 1
  • getset_descriptor

    What is the dict dict attribute of a Python class up vote 43 down vote favorite 23 gt gt gt class A object pass gt gt gt
  • 第六章 Hystrix断路器详解+环境搭建

    目录 一 Hystrix的背景及介绍 1 分布式系统面临的问题 2 解决方案 3 Hystrix介绍 4 Hystrix服务熔断 二 搭建项目基础环境 1 创建 父工程及公共api 见 第三章 2 创建 Eureka 服务 见 第三章 3
  • c语言宏定义唯一匿名变量,C语言宏定义技巧

    写好C语言 漂亮的宏定义很重要 使用宏定义可以防止出错 提高可移植性 可读性 方便性 等等 下面列举一些成熟软件中常用得宏定义 1 防止一个头文件被重复包含 ifndef COMDEF H define COMDEF H 头文件内容 end
  • MySQL/MariaDB 查询某个 / 多个字段重复数据

    创建测试表和数据 创建表 create table if not exists t duplicate name varchar 255 not null age int not null 插入测试数据 insert into t dupl
  • Pat刷题真题乙级(4)

    标题 前言 Pat乙级1013 组个最小数 Pat乙级1014 科学计数法 Pat乙级1017 打印沙漏 Pat乙级1018 人口普查 Pat乙级1019 旧键盘 前言 这个周末花了两天才写了五道题 嘿嘿 康康吧 Pat乙级1013 组个最
  • Vscode跳板机和通过代理连接远程服务器设置方法

    文章目录 一 VScode跳板机配置 1 ssh安装 config文件配置 二 通过代理连接远程服务器设置方法 本文适用于windows系统 linux系统可以适当参考 主要包括两方面的内容 1 通过跳板机连接远程服务器或远程服务器上的容器
  • Python统计模型探索性数据分析(EDA)系统(单变量-双变量-相关性-缺失值)

    单变量分析 单变量分析旨在更深入地了解单个列 它创建该列的各种统计数据和可视化 例如 要深入了解 特征 year built 要计算year built 的最小值 最大值 不同计数 中值 方差 并创建一个箱线图来检查异常值 一个正常的 Q
  • vsocde使用命令行上传项目到GitHub

    文章目录 前言 一 git init初始化 二 git status查看状态 三 git remote add origin连接远程仓库 四 git add添加文件 五 git commit文件 六 git push 刷到远程仓库 前言 链
  • 合宙Air724UG LuatOS-Air LVGL API控件--进度条 (Bar)

    进度条 Bar Bar 是进度条 可以用来显示数值 加载进度 示例代码 创建进度条 bar lvgl bar create lvgl scr act nil 设置尺寸 lvgl obj set size bar 200 20 设置位置居中
  • Vite 配置 cdn 加载资源

    一 介绍 上篇文章我们从零配置 Vite Vue3 0 开发环境 生产环境 本篇文章我们配置 CDN 加载 因为 Vite 不会重写从外部文件导入的内容 我们需要使用支持 ESM 编译的 CDN 这里我们使用 https esm sh 来引
  • GDCM:GDCM::DataSet的测试程序 C/C++

    GDCM GDCM DataSet的测试程序 C C GDCM Grassroots DICOM 是一个用于处理医学影像和通信的开源软件库 它提供了各种功能 包括读取 写入 转换和处理DICOM 数字影像和通信医学 文件 GDCM库是用C
  • DGL-KE:亚马逊开源知识图谱嵌入库

    这个库的开源已经是去年 2020 的事情了 突然感觉时间好快 当时并没有在意 最近关注到这个库是因为自己在训练知识图谱 Embedding 的时候做的一些调研 考虑到后续大规模知识图谱的训练 需要更快的开源库 于是DGL KE 重新回到我的
  • Spring(二):更简单的存储与读取 Bean

    通过上一章的Spring 我们基本实现了Spring 的读取与存储 但是在操作过程中 读取与存储并没有那么得 简单 一套流程还是很复杂 所以 本章来介绍更加简单得读取与存储 在 Spring 中想要更简单的存储和读取对象的核 是使 注解 也