Spring——更快捷的存储 / 获取Bean对象

文章目录

  • 前言
  • 一、存储 Bean 对象
    • 类注解
      • 为什么有五个类注解
      • 使用类注解存储对象
        • 配置扫描路径(重中之重)
        • 添加注解存储 Bean 对象
    • 方法注解
        • 配置扫描路径(重中之重)
        • 使用方法注解存储对象
  • 二、获取 Bean 对象
    • @Autowired
      • 属性注入
      • Setter注入
      • 构造方法注入
    • @Resource
  • 总结


前言

本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下,以后互相学习,共同进步。这篇文章能够帮助到你的话,劳请大家点赞转发支持一下!


一、存储 Bean 对象

在这里插入图片描述

上篇文章中,向Spring容器中添加对象,还要去配置文件里手动添加,这貌似并不比new便捷。

而Spring项目中呢,往往采用更加便捷的 “注解” 来向Spring容器中添加对象


类注解

要想将 对象存储到 Spring 中,一共有两种注解类型可以实现:

  • 类注解: @Controller、@Service、@Repository、@Component、@Configuration
  • 方法注解: @Bean。

为什么有五个类注解

类注解一共有五个,但是这五个类注解的功能可以说是一模一样。

那么功能一样,有一个不就好了,为什么还要有五个呢?

这其中的道理,就好像笔记本类型,有轻薄本,办公本,游戏本。
他们不也都是笔记本吗,为什么还要分成三种呢?
因为人们可以从这个类型就看出笔记本更适合干什么。
轻薄本,更加轻薄,便于携带。
办公本,更加适合办公。
游戏本,性能更强,适用于打游戏,与一些需要生产力的场景(视频渲染,建模等)。


所以为什么会有五个功能相同的类注解呢?
在一个项目的开发中,往往需要多名程序员协同开发,
而这五个类注解的目的就是为了让 程序员看到类注解,就能直接了解当前类的用途

  • @Controller:业务逻辑层,负责校验参数的合法性。
  • @Service:服务层,负责业务组装。
  • @Repository:数据持久层,负责实际业务处理。
  • @Configuration:配置层,负责存储配置类。
  • @Component:工具层,负责存储工具类。

在这里插入图片描述

查看 @Controller、@Service、@Repository、@Configuration 的源码可以发现,这些注解里面都有注解@Component,所以 这四个注解都是@Component的子类
在这里插入图片描述

  • 五个类注解功能相同,下面就只拿@Controller注解做例子讲解了!!!

使用类注解存储对象

配置扫描路径(重中之重)

在配置文件(这里我的配置文件是spring-config.xml)中,添加一行代码即可。

<content:component-scan base-package=""></content:component-scan>

此时Spring就 只会扫描这个路径对应的包中的注解,以及子包中有注解的类 ,并将注解类添加到容器中。

举例 在这里插入图片描述
我路径对应的包是test包,所以此时:
Spring
只会扫描test包中的类,以及test的子包 demo包中的类。

不会扫描与test包同级的School类,也不会扫描与test包同级的example包中的类。

扫描路径也是为了提升性能,在实际开发中,一个项目可能包含许多类,如果都扫描的话,那么就会影响性能,因此就有了扫描路径,只扫描该路径下的类。

  • 注意注意注意!!! 不在扫描路径的包中的类,即便是这个包上一级中的类,同级的类,同一级包中的类,即便添加了注解,也不会被存储到Spring容器中!!!!!!!!!!!
  • 可以配置多个扫描路径!!!Spring会同时将这些路径中的注解放到容器中。 在这里插入图片描述

添加注解存储 Bean 对象

五各类注解的使用方法相同,只拿@Controller注解做示范,想用其他注解,使用方法相同。

添加注解存储对象有两种方式:

注解中设置名字在这里插入图片描述
这个value相当于给注解设置名字,然后根据名字在容器中查找取出对象。
在这里插入图片描述
有两种设置名字的写法,这两种写法都一样。
在这里插入图片描述

注解中不给参数
此时就会根据类名来给你一个默认的名字。下面咱们看下给默认名字方法的源码。在这里插入图片描述
如果 类名的第一个字母与第二个字母都是大写 ,那么他的 默认名字是原类名
如果 类名的第一个字母与第二个字母有一个不是大写或都不是大写 ,那么他的 默认名字是首字母小写的类名

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


方法注解

配置扫描路径(重中之重)

上述类注解配置扫描路径,这一个扫描路径可以同时供类注解与方法注解使用,配置方法与类注解一致。


使用方法注解存储对象

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

方法注解的作用,就是将这个方法返回的对象存储到容器中。

拿下面两个类举例:
在这里插入图片描述在这里插入图片描述

方法注解有两点需要注意
1️⃣方法注解要搭配类注解使用。
不搭配类注解使用在这里插入图片描述> 在这里插入图片描述
可以看到不搭配类注解使用就会报错
Spring只会扫描添加了类注解的类 里面是否有方法注解。

搭配类注解使用在这里插入图片描述在这里插入图片描述

方法注解搭配类注解时,类注解同样生效,被类注解标记的类也会被存入容器中


2️⃣添加方法注解的方法不能有参数(任何类型的参数都不行)。
在这里插入图片描述
在这里插入图片描述


下面咱们就来讲一讲方法注解的命名吧!
在这里插入图片描述
方法注解@Bean,可以设置value与name设置哪个都行,都当名字用。
值得注意的是方法注解可以设置多个名字,当然也可以不设置名字。

不设置名字 在这里插入图片描述

在这里插入图片描述

设置一个名字 在这里插入图片描述
在这里插入图片描述

设置多个名字

在这里插入图片描述

在这里插入图片描述

  • 注意!!! 当你设置名字后,默认命名就失效了!!再用默认命名就会抛出异常
    在这里插入图片描述在这里插入图片描述

二、获取 Bean 对象

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

对象装配(对象注入)的实现方法有以下 3 种

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

@Autowired

这三种方式都可以由注解@Autowired实现的,只是实现方式不同

下面就用IoC容器模拟实现一对一家教的老师分配学生的场景来讲解三种注入方法。
所需要用到的类,Student(代表一个学生),Students(学生表),Teacher(表示一个教师),App(启动类/测试类)
在这里插入图片描述

Student类在这里插入图片描述

Students类,通过方法注解@Bean将Student对象添加到IoC容器中。在这里插入图片描述

Teacher类,在里面通过给student变量注入对象来演示三种对象注入的方式。在这里插入图片描述


属性注入

使用示例:
Teacher类中的Student类型的student变量,就通过属性注入的方法,在IoC容器中注入了对象 在这里插入图片描述在这里插入图片描述
属性注入的工作原理就是通过你变量的类型,去IoC容器中找寻匹配的类型然后注入到对应的变量中!

BUG
假如IoC容器中有两个相同变量的类型,此时就会有BUG。
修改Students代码,让他向IoC容器中添加两个相同类型的对象。
在这里插入图片描述
在这里插入图片描述
解决方案1️⃣:使变量名与@Bean的名字相同。
在这里插入图片描述
解决方案2️⃣:@Autowired配合@Qualifier一起使用
在这里插入图片描述

属性注入的优缺点:
优点
使用简单。


缺点
1️⃣:无法注入final修饰的变量。在这里插入图片描述

2️⃣:通用性问题,只适用于IoC容器。
修改代码,Teacher类不在IoC容器中在这里插入图片描述在这里插入图片描述
此时就不会再进行属性注入了!

3️⃣:更容易违背单一设计原则


Setter注入

使用示例:在这里插入图片描述
在这里插入图片描述
setter注入的工作原理就是通过你方法参数的类型,去IoC容器中找寻匹配的类型然后注入到参数中!
工作原理与属性注入相同,所以BUG也相同,解决方案也相同。

BUG
假如IoC容器中有两个相同变量的类型,此时就会有BUG。
修改Students代码,让他向IoC容器中添加两个相同类型的对象。
在这里插入图片描述


解决方案1️⃣:使参数列表的变量名与@Bean的名字相同。
解决方案2️⃣:@Autowired配合@Qualifier一起使用在这里插入图片描述

setter注入的优缺点:
优点
通常Setter只Set一个属性,所以Setter注入更符合单一设计的原则。


缺点
1️⃣:无法注入final修饰的变量。
2️⃣:setter注入的对象可以被改变,因为setter是一个方法,可能会被调用多次,因此注入的对象就被改变了。


构造方法注入

使用示例:在这里插入图片描述
在这里插入图片描述
构造方法注入的工作原理就是通过构造方法方法参数的类型,去IoC容器中找寻匹配的类型然后注入到参数中!
工作原理与属性注入相同,所以BUG也相同,解决方案也一半相同。

BUG
假如IoC容器中有两个相同变量的类型,此时就会有BUG。
修改Students代码,让他向IoC容器中添加两个相同类型的对象。
在这里插入图片描述


解决方案:使参数列表的变量名与@Bean的名字相同。
在这里插入图片描述

构造方法注入的优缺点:
优点
1️⃣可以注入final修饰的变量在这里插入图片描述
2️⃣:注入的对象不会被修改,因为构造方法只加载一次。
3️⃣:构造方法注入可以保证注入对象完全初始化。
4️⃣:构造方法注入通用性更好。



缺点
1️⃣:写法比属性注入复杂。
2️⃣:使用构造方法注入,无法解决循环依赖的问题。


@Resource

@Resource与@Autowired的使用方式方法一模一样,但是这两个注解也是有区别的。

@Resource与@Autowired的区别
1️⃣ 出身不同 :@Resource来自于JDK,@Autowired来自于Spring框架。
2️⃣ 支持参数不同 :@Resource支持很多参数设置,@Autowired只支持一个参数设置。(下篇文章介绍)
3️⃣ 使用上的区别 :@Resource不支持构造方法注入,@Autowired支持构造方法注入。
4️⃣ IDEA兼容性不同 :@Autowired在专业版IDEA中可能会误报,@Resource不会。


总结

以上就是今天要讲的内容,本文介绍了使用注解更快捷便利的存储获取Bean对象!

路漫漫不止修身,也养性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git操作:修改本地的地址

Windows下git如何修改本地默认下载仓库地址 - 简书 (jianshu.com) 详细解释&#xff1a; 打开终端拉取git时&#xff0c;会默认在git安装的地方&#xff0c;也就是终端前面的地址。 需要将代码 拉取到D盘的话&#xff0c;现在D盘创建好需要安放代码的文件夹&#xff0c;然后…

K8S群集调度

目录 一、调度约束二、Pod 启动典型创建过程三、K8S的调度过程3.1 Predicate&#xff08;预选策略&#xff09; 常见的算法使用3.2 常见优先级选项3.3 指定调度节点3.3.1 nodeName指定3.3.2 nodeSelector指定3.3.3 Pod亲和性与反亲和1.节点亲和硬策略示例2.节点亲和软策略示例3…

数字工厂管理系统的实施步骤是什么

数字工厂管理系统是一种基于数字化技术和智能化设备的工厂管理系统&#xff0c;它可以实现工厂的全面、实时、动态管理&#xff0c;提高生产效率、降低成本、保证产品质量。实施数字工厂管理系统需要一系列的实施步骤&#xff0c;下面就数字工厂管理系统的实施步骤进行详细说明…

Is Mapping Necessary for Realistic PointGoal Navigation 论文阅读和代码分析

论文 论文信息 题目&#xff1a;Is Mapping Necessary for Realistic PointGoal Navigation? 作者&#xff1a;Ruslan Partsey、 Erik Wijmans 代码地址&#xff1a;rpartsey.github.io/pointgoalnav 来源&#xff1a;CVPR 时间&#xff1a;2022 Abstract 目标&#xff1a…

Godot在多边形内随机获取点

前言&#xff1a; 我做了一个随机生成器&#xff0c;可以生成游戏道具&#xff0c;之前是矩形比较好算&#xff0c;随着关卡设计我需要多边形的生成方式。 在矩形内获取随机点&#xff1a; func generateRandomCoordinateInRect(pos,size):"""根据范围生成随机…

记一次安装nvm切换node.js版本实例详解

最后效果如下&#xff1a; 背景&#xff1a;由于我以前安装过node.js&#xff0c;后续想安装nvm将node.js管理起来。 问题&#xff1a;nvm-use命令行运行成功&#xff0c;但是nvm-list显示并没有成功。 原因&#xff1a;因为安装过node.js&#xff0c;所以原先的node.js不收n…

二十一章:PUZZLE-CAM:通过匹配局部和全局特征来改进定位

0.摘要 弱监督语义分割&#xff08;WSSS&#xff09;被引入来缩小从像素级监督到图像级监督的语义分割性能差距。大多数先进的方法是基于类激活图&#xff08;CAM&#xff09;来生成伪标签以训练分割网络。WSSS的主要局限性在于从使用图像分类器的CAM生成伪标签的过程主要集中在…

【React Native】学习记录(一)——环境搭建

Expo是一套工具&#xff0c;库和服务&#xff0c;可让您通过编写JavaScript来构建原生iOS和Android应用程序。 一开始学习的时候直接使用的是expo。 npx create-expo-app my-appcd my-appnpm run start接下来需要搭建安卓和IOS端&#xff08;为此特意换成了苹果电脑&#xff09…

虹科案例|如何分析设备故障时间和次数,打破生产瓶颈?

虹科设备绩效管理系统 保障生产设备的稳定性和可靠性 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶…

【Spring Cloud】Gateway的配置与使用

文章目录 前言第一步&#xff0c;创建一个springboot工程第二步&#xff0c;添加依赖第三步&#xff0c;编写yml文件第四步&#xff0c;启动主启动类总结 前言 Gateway其实是springcloud 原生的东西&#xff0c;但是我还是想放在这里讲&#xff0c;因为我们使用nacos时&#x…

【腾讯云 Cloud Studio 实战训练营】CloudStudio体验真正的现代化开发方式,双手插兜不知道什么叫对手!

CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01; 文章目录 CloudStudio体验真正的现代化开发方式&#xff0c;双手插兜不知道什么叫对手&#xff01;前言出现的背景一、CloudStudio 是什么&#xff1f;二、CloudStudio 的特点三、CloudS…

Mac 快速生成树形项目结构目录

我这里使用的是通过包管理 Homebrew安装形式。没有安装的话可以自行搜索 Homebrew 安装方式 brew install tree直接到项目的根目录执行 tree 命令 tree 效果如下&#xff1a; or &#xff1a; tree -CfL 3效果如下&#xff1a;

2023-07-27 LeetCode每日一题(删除每行中的最大值)

2023-07-27每日一题 一、题目编号 2500. 删除每行中的最大值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果…

LeetCode130.Surrounded-Regions<被围绕的区域>

题目&#xff1a;被围绕的区域 思路&#xff1a; 好吧&#xff0c;这题不会。 bfs递归 dfs非递归 dfs并查集 - 被围绕的区域 - 力扣&#xff08;LeetCode&#xff09; 将问题转化为与边界O相连的O。有点像岛屿问题了。 代码是&#xff1a; //codeclass Solution { public:vo…

8.事件对象

8.1获取事件对象 ●事件对象是什么 也是个对象&#xff0c;这个对象里有事件触发时的相关信息 例如&#xff1a;鼠标点击事件中&#xff0c;事件对象就存了鼠标点在哪个位置等信息 ●使用场景 可以判断用户按下哪个键&#xff0c;比如按下回车键可以发布新闻 可以判断鼠标点击…

绝绝子,这所211无歧视!极其保护一志愿!专硕爆冷全部录取!

一、学校及专业介绍 大连海事大学&#xff08;Dalian Maritime University&#xff09;&#xff0c;简称海大&#xff0c;位于辽宁省大连市&#xff0c;是中华人民共和国交通运输部所属的全国重点大学&#xff0c;位列国家“双一流”、“211工程”重点建设高校。 1.1 招生情况…

SQL-每日一题【1070. 产品销售分析 III】

题目 销售表 Sales&#xff1a; 产品表 Product&#xff1a; 编写一个 SQL 查询&#xff0c;选出每个销售产品 第一年 销售的 产品 id、年份、数量 和 价格。 结果表中的条目可以按 任意顺序 排列。 查询结果格式如下例所示&#xff1a; 示例 1&#xff1a; 解题思路 前置知…

适配器模式与装饰器模式对比分析:优雅解决软件设计中的复杂性

适配器模式与装饰器模式对比分析&#xff1a;优雅解决软件设计中的复杂性 在软件设计中&#xff0c;我们常常面临着需要将不同接口或类协调工作的情况&#xff0c;同时还要满足灵活性和可扩展性的需求。为了应对这些挑战&#xff0c;适配器模式和装饰器模式应运而生&#xff0c…

一文速览ICML 2023测试时自适应/在线学习相关论文

现实场景中&#xff0c;模型不仅仅局限于单次训练&#xff0c;在部署之后是依然可以利用在线的数据流对模型进行一些调整&#xff0c;本文总结了和 Test time adaptation, online learning 场景下 ICML 2023 的相关文章。 01 / ICML 2023 / 论文标题&#xff1a; Uncovering Ad…