【JavaEE进阶】——第四节.Spring更简单的实现Bean对象的存取(利用注解储存和注入Bean对象)

news2024/11/26 18:20:04

作者简介:大家好,我是未央;

博客首页:未央.303

系列专栏:JavaEE进阶

每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!

文章目录

前言

一、储存Bean对象

1.1 5大类注解

1.2 @Bean方法注解

二、获取Bean对象

2.1 属性注入

优缺点 

2.2 Setter注入

优缺点分析  

2.3 构造方法注入

 优缺点分析 

三、经典面试题

总结


前言

上一节内容我们学习了有关spring core的项目创建和使用,介绍了最基本的方法创建spring;

本节内容我们将介绍另外一种更加简单的方法,通过注解来注入bean对象;


上篇博客,我们讲了一个spring core项目的大致流程:

创建项目——》将对象储存到Spring容器中 ——》从Spring容器中取出Bean对象

但是吧,上篇讲的这些流程还是太繁琐了,有没有一个更简单的方式来实现对象的存取呢?

当然有,一起来看看吧!

首先,Spring项目的创建——这个没有什么好说的!就按我们上篇博客的步骤来进行。

但注意:与上篇博客相比,spring的配置文件发生了改变——为了更简单的实现Bean对象的存入(把对象存到spring中)

更改后的spring配置文件:

<?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="在对象储存中,要扫描的路径"></content:component-scan>
</beans>

一、储存Bean对象

首先我们回忆下,我们执行储存Bean对象的方式。

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

这种存入 Bean 的方式,并不是很好!

原因:

1、需要手动添加 bean 对象 到 配置文件中
2、如果 是配置文件中出现了问题,不好调试。
 

而现在我们不需要一个一个的在spring配置文件中添加我们要储存的Bean对象

我们直接:

 你还需要再类中添加注解——再扫描的过程中,只有添加了注解的类才能成功存储到spring中;

这就引起了我们注解的概念:

一共有两种方法:
(1)使用 5 大类注解实现

1、@Controller 【Controller - 控制器】
2、@Service 【service - 服务】
3、@Repository 【repository - 仓库】
4、@Configuration 【configuration - 配置/布局】
5、@Component 【component - 组件】

(2)通过 方法注解@Bean ,也可以将 一个 bean 存储到 Spring 中。


我们先介绍第一种方法:

1.1 5大类注解

@Service注解介绍:
 

上面我们用到了@Service注解,其他四个注解@Controller、@Repository也是一样的。 


补充1: 

既然这5大类注解的用法这么相似,那为啥还要分成5个不同的注解?统一弄成一个注解不好吗?

解答:

要解答这个问题,首先我们先要了解软件工程方面的知识;


之所以讲这个 关于“软件分层” 的定义呢,就是为了 后面讲解 “为什么要有五大注解类” 做铺垫!

既然这5大类注解对应着软件分层中的不同层——他们各自要实现的功能是不同的。

这也就不难理解为啥要分成5大类中注解了;


补充2:

你可能还有一个疑惑:为什么?我们的 Spring 一定要有下面这个配置呢?

解答:

如果没有这个配置,意味着什么??

大家可以想象一下:
一个 Spring 项目中,我们的类可分两种类型:

1、需要 进行 控制反转的类,将类的“生命周期”交给 Spring 来管理的类。【比如:UserController】

2、不需要存入 Spring 中的 类。

举例说明:

假设,我们有一个大型项目,需要存入 Spring 的 类 和 不需要存入 Spring 中的类,个数占比是五五开的。
这就会存在问题了!
如果我们没有 描述 根目录 的 这一行代码,
Spring 就会去扫描 所有的类,看看这些类中有哪些。
但是!项目中 需要存入 Spring 中的类,只占 50 %。
即:Spring 要浪费一倍的时间,去排查 不需要 存入 Spring 中的类。
所以,Spring 为了 提升效率,你必须要给我指定扫描的目录。
保证该目录下,一定是需要存入 Spring中的类。

这样 Spring就只需要扫描 对应目录中的类,就可以了!



1.2 @Bean方法注解

方法步骤:

上面我们通过5大类注解还有Bean方法实现了简单往spring中存Bean对象。那么怎样实现简单的从spring中取Bean对象呢?


二、获取Bean对象

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

对象注入,其实就是我们spring中的DI——依赖注入

IoC 和 DI 是 Spring 中最重要的两个概念,其中 IoC(Inversion of Control)为控制反转的思想,而 DI(Dependency Injection)依赖注入为其(IoC)具体实现。那么 DI 实现依赖注入的方式有几种?这些注入方式又有什么不同?

在 Spring 中通过@Autowired实现依赖注入的常见方式有以下 3 种:

  1. 属性注入(Field Injection)
  2. Setter 注入(Setter Injection)
  3. 构造方法注入(Constructor Injection)

首先我们介绍第一个属性注入:

2.1 属性注入

因此,可以得出结论:

在使用 @Autowired 进行 属性注入的时候
如果 注入的对象,被多次 存入 Spring 中了,那么,光凭 属性的类型是找不到匹配的 bean的!需要将 属性的变量名 改成 BeanName,根据 BeanName 来找寻匹配的对象(bean)并进行 属性注入。

方法不止这一种,但是上述这种 “精确描述 bean 的名称” 的方法,是最简单高效的!

是不是很简单,不用去获取 Spring 的上下文对象 和 getBean 方法,直接通过一个注解,即可获取对应的bean(从Spring中取出 bean)。

举例说明:

当同一个类型的 Bean 存在多个时就有可能出现非唯一 Bean 的异常;

那么我们怎么解决这个问题呢?

两种办法:

 1、把你的属性名给改成类中的方法名student1或者student2;

2、用@Qualifier 是用来筛选 Bean 

优缺点 

优点:

属性注入最大的优点就是实现简单、使用简单只需要给变量上添加一个注解;(@Autowired),就可以在不 new 对象的情况下,直接获得注入的对象了(这就是 DI 的功能和魅力所在)

缺点:

  1. 功能性问题:无法注入一个不可变的对象(final 修饰的对象——无法被初始化);
  2. 通用性问题:只能适应于 IoC 容器;
  3. 设计原则问题:更容易违背单一设计原则(因为使用方便,在程序中可能大量使用属性注入)。

2.2 Setter注入


优缺点分析  

从上面代码可以看出,Setter 注入比属性注入要麻烦很多。

优点:

要说 Setter 注入有什么优点的话,那么首当其冲的就是它完全符合单一职责的设计原则,因为每一个 Setter 只针对一个对象

缺点:

但它的缺点也很明显,它的缺点主要体现在以下 2 点:

  1. 不能注入不可变对象(final 修饰的对象——无法通过构造方法初始化);
  2. 注入的对象可被修改(setter方法可多次被调用)

2.3 构造方法注入

 优缺点分析 

优点:

构造方法注入相比于前两种注入方法,它可以注入不可变对象,并且它只会执行一次,也不存在像 Setter 注入那样,被注入的对象随时被修改的情况,它的优点有以下 4 个:

可注入不可变对象(在构造方法中就进行了初始化);
注入对象不会被修改(一个类中,构造方法只能调用一次);
注入对象会被完全初始化;
通用性更好(即可以用于IoC容器,也可以用于非IoC容器)。

缺点:

因为在构造方法中可以传多个参数,容易违背单一性原则;



 

三、经典面试题

1.属性注入 ,构造方法注入 和 Setter 注入 之间,有什么区别?


2.@Resource VS @Autowired 的区别

@Autowired是spring提供的注解,@Resource是jdk提供的注解

1、用法不同

  • Autowired,支持 属性注入,构造方法注入,Setter 方法注入。
  • @Resource:支持 属性注入,Setter方法注入。不支持 构造方法注入。

2、@Resource 的 属性注入 比 @Autowired 的 属性注入,使用的更舒服。 因为 @Resource 有很多的属性可以设置;而 @Autowired 只有一个 value 属性。

有很多的属性,即意味着可以使用很多其它的功能。
比如在上面的当同一个类型的 Bean 存在多个时就有可能出现非唯一 Bean 的异常,如果是@Autowired,我们还需要额外的@Qualifier 是用来筛选并 Bean。

而@Resource则可以直接:


总结

今天的内容就分享到这里,我们下期再见!!!!!!

 

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

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

相关文章

Linux安装flutter

在Linux上安装flutter 1.使用快照安装flutter 安装snapd sudo apt update sudo apt install snapd安装flutter sudo snap install flutter --classic显示flutter sdk-path flutter sdk-path2.手动安装flutter 在flutter官网上查看安装流程 https://docs.flutter.dev/get…

现代微服务中缓存的分类及缓存一致性设计原则

引言 大部分面向公众的互联网系统&#xff0c;其并发请求数量与在线用户数量都是正相关的&#xff0c;而 MySQL能够承担的并发读写量是有一定上限的&#xff0c;当系统的访问量超过一定程度的时候&#xff0c;纯MySQL就很难应付了。 绝大多数互联网系统都是采用MySQLRedis这对…

MongoDB【索引-index】

目录 1&#xff1a;概述 2&#xff1a;索引的类型 2.1&#xff1a;单字段索引 2.2&#xff1a;复合索引 2.3&#xff1a;其他索引 3&#xff1a;索引的管理操作 3.1&#xff1a;索引的查看 3.2&#xff1a;索引的创建 3.3&#xff1a;索引的移除 4&#xff1a;索引的…

【福利赠书】有人说,测试驱动开发已死?(文末赠书3本)

友情推荐一本测试领域的教科书&#xff1a;&#xff08;文末送3本&#xff09; 《 测试驱动开发&#xff1a;入门、实战与进阶》&#xff0c;英文原书名为《Learning Test-Driven Development 》&#xff0c;是一本实用且有趣的TDD实践教程。如果你想开始做测试驱动开发&#x…

【WPF动画】简单构造一个相册轮播图淡化切换特效

效果图 简单的定时器结合DoubleAnimation使用示例&#xff0c;实现轮播图淡化切入特效 代码部分 <Image x:Name"carouselImage" Margin"10" HorizontalAlignment"Center" VerticalAlignment"Center" Stretch"UniformToFill&…

倾斜摄影超大场景的三维模型的顶层合并的纹理压缩与抽稀处理技术分析

倾斜摄影超大场景的三维模型的顶层合并的纹理压缩与抽稀处理技术分析 倾斜摄影超大场景的三维模型的顶层合并需要对纹理进行压缩和抽稀处理&#xff0c;以减小数据量和提高数据的传输和展示性能。以下是一种常用的纹理压缩和抽稀处理技术&#xff1a; 1、纹理图集 纹理瓦片化…

网络安全漏洞分析之远程代码执行

介绍 Apache Flume 是一个分布式的&#xff0c;可靠的&#xff0c;并且可用于高效地收集&#xff0c;汇总和移动大量日志数据的软件。它具有基于流数据流的简单而灵活的体系结构。它具有可调的可靠性机制以及许多故障转移和恢复机制&#xff0c;并且具有健壮性和容错性。它使用…

国民技术N32G430开发笔记(9)- IAP升级 Bootloader的制作

IAP升级 Bootloader的制作 1、上节提到Flash的分区&#xff0c;0x8000000-0x8004000为Boot分区&#xff0c;我们的bootloader就烧录到此分区。 Bootloader很简单&#xff0c;新建一个普通的工程&#xff0c; 也不用初始化外部设备&#xff0c;开机后&#xff0c;直接跳转到 A…

【方法】 如何批量将RAR或其他压缩格式转换成ZIP?

压缩文件的格式有很多种&#xff0c;比如RAR、ZIP、7-Zip、CAB、ARJ、ACE、TAR、BZ2等等。因为需求不同&#xff0c;或者不同平台对上传的压缩包格式要求不同&#xff0c;我们往往需要把压缩文件进行格式转换&#xff0c;那压缩文件不同格式之间如何进行转换呢&#xff1f; 如…

AlgoC++第八课:手写BP

目录 手写BP前言1. 数据加载2. 前向传播3. 反向传播总结 手写BP 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程主要是手写 BP 代码 课程大纲可看下面的思维导图 1. 数据加载 我们首先来实现下MNIST…

15-721 Chapter10 恢复协议

BackGround 为了在可能crash的情况下&#xff0c;确保事务和数据库状态的&#xff0c;一致性&#xff0c;原子性&#xff0c;持久性。恢复算法大体可以分为两个方面&#xff1a;1.在事务过程中要做哪些处理 2.崩溃后要做哪些处理。 与disk数据库的差异 1.恢复不需要跟踪dir…

独立IP服务器和共享IP服务器有什么区别

在选择一个合适的服务器时&#xff0c;最常见的选择是共享IP服务器和独立IP服务器。尽管两者看起来很相似&#xff0c;但它们有着很大的不同。本文将详细介绍共享IP服务器和独立IP服务器的不同之处&#xff0c;以及如何选择适合您需求的服务器。 一、什么是共享IP服务器? 共享…

PHPStudy hosts文件可能不存在或被阻止打开,同步hosts失败

在使用PHPStudy建站包时&#xff0c;有时会遇到同步hosts失败的问题&#xff0c;可能是因为hosts文件不存在或被阻止打开。这个问题通常可以通过以下几个步骤解决&#xff1a; 步骤一&#xff1a;检查hosts文件是否存在 首先&#xff0c;我们需要检查一下hosts文件是否存在。…

【漏洞复现】海康威视综合安防管理平台Fastjson远程命令执行漏洞复现

文章目录 前言声明一、海康威视综合安防管理平台简介二、漏洞描述三、影响版本四、漏洞复现五、修复方案 前言 ​海康威视综合安防管理平台存在Fastjson远程命令执行漏洞&#xff0c;攻击者可通过构造恶意Payload执行并获取服务器系统权限以及敏感数据信息。 声明 本篇文章仅…

计算机网络学习07(DNS域名系统详解)

DNS&#xff08;Domain Name System&#xff09;域名管理系统&#xff0c;是当用户使用浏览器访问网址之后&#xff0c;使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题。 在实际使用中&#xff0c;有一种情况下&#xff0c;浏览器是可以不必动用 DNS 就可以获知…

【Java】SpringBoot中实现多数据源切换

前言 在日常项目开发中&#xff0c;某些需求会让不同的数据落实到不同的数据库&#xff0c;也或许是不同的页面需要不同数据库中的数据&#xff0c;在这种场景下&#xff0c;我们可以使用多数据源的配置来完成&#xff0c;通过在springboot中的yml文件配置多个数据源方式即可完…

一篇文章解决Mysql8

基于尚硅谷的Mysql8.0视频&#xff0c;修修改改。提取了一些精炼的内容。 首先需要在数据库内引入一张表。链接地址如下。 链接&#xff1a;https://pan.baidu.com/s/1DD83on3J1a2INI7vrqPe4A 提取码&#xff1a;68jy 会进行持续更新。。 1. Mysql目录结构 Mysql的目录结构…

时序预测相关技术分享

时序预测相关技术分享 时序预测是指对时间序列数据进行预测&#xff0c;以预测未来的趋势或行为。在实际生产和应用中&#xff0c;时序预测广泛应用于金融、电力、交通等领域。时序预测可以帮助人们更好地理解和掌握未来的趋势和规律&#xff0c;从而做出更明智的决策。 时序…

Go语言测试——【单元测试 | Mock测试 | 基准测试】

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客主页&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 序一、单元测试1. 测试文件命名2. 测试函数3.…

【Linux脚本篇】什么是shell脚本,什么是shell变量

目录 &#x1f341;什么是shell &#x1f342;什么是shell脚本 &#x1f342;shell脚本能做什么 &#x1f342;学习shell需要哪些知识 &#x1f342;shell基本规范 &#x1f342;shell脚本五种运行方式 &#x1f341;shell变量 &#x1f342;变量命名规范 &#x1f342;shell变…