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

news2024/11/17 6:52:40

文章目录

  • 前言
  • 一、存储 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对象!

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

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

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

相关文章

day17-二叉树的迭代遍历

二叉树的迭代遍历 二叉树的递归遍历是比较简单的 前序中序后序 前序遍历 前序遍历代码如下&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;preorder(root,res);return res;}void preorder(TreeNode* …

进度条 Vue2 +PC端 ,点击页面加载时页面顶部的那个蓝条

提示&#xff1a; <div class"global-loading"> </div> css:less <style lang"less"> .global-loading {background-color: red;height: 10px;position: fixed;z-index: 999;width: 0;animation: grow 2s infinite forwards;}keyframe…

ROS从入门到精通6-8:costmap代价地图插件编写案例(prohibition_layer)

目录 0 专栏介绍1 为什么需要代价地图插件?2 自定义代价地图插件3 仿真测试0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。 🚀详情:《ROS从入门到精通》 1 为什么需要代价地图插…

PHP: 开发入门macOS系统下的安装和配置

安装Homebrew 安装 ~~友情提示&#xff1a;这个命令对网络有要求&#xff0c;可能需要翻墙或者用你的手机热点试试&#xff0c;或者把DNS换成&#xff08;114.114.114.114 和 8.8.8.8&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

tensorRT模型性能测试

目录 前言1. 模型训练1.1 模型1.2 数据集1.3 xml2yolo1.4 yolo2json1.5 json2yolo1.6 训练 2. TRT模型转换2.1 YOLOv5 ONNX导出2.2 YOLOv6 ONNX导出2.3 YOLOv5 engine生成2.4 YOLOv6 engine生成 3. TRT模型测试3.1 YOLOv5 engine mAP测试3.2 YOLOv5 engine 速度测试3.3 YOLOv6 …

代码随香录算法训练营day16 | 104. 二叉树的最大深度,559. N 叉树的最大深度,111. 二叉树的最小深度,222. 完全二叉树的节点个数

目录 104. 二叉树的最大深度 559. N 叉树的最大深度 111. 二叉树的最小深度 222. 完全二叉树的节点个数 104. 二叉树的最大深度 学了回溯之后再来做一下 思路&#xff1a; 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数或者节点数&#xff08;取…

chatgpt 接口使用(一)

使用api实现功能 参考链接&#xff1a;https://platform.openai.com/examples 安装库&#xff1a; pip3 install openai 例如&#xff1a; import os import openaiopenai.api_key os.getenv("OPENAI_API_KEY") response openai.ChatCompletion.create(model&q…

Flutter:使用url_launcher打开外部浏览器、拨打电话、发送短信、打开第三方app、打开应用商店下载应用

前言 Flutter中的url_launcher是一个用于打开URL的插件。它允许在Flutter应用程序中打开网址、发送电子邮件、拨打电话等操作。使用url_launcher插件&#xff0c;可以轻松地在应用程序中集成各种URL操作。 官方地址 https://pub-web.flutter-io.cn/packages/url_launcher 安…

Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前

Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前 一、概述 在项目开发中&#xff0c;遇到一个类似于 超时关闭的订单&#xff08;超过1分钟后关闭订单&#xff09; 的需求&#xff0c;在数据的时间写入时&#x…

【Python机器学习】实验06 KNN最近邻算法

文章目录 KNN算法前言 距离度量(1) 欧式距离(2) 曼哈顿距离(Manhattan distance)(3) 切比雪夫距离(Chebyshev distance)(4) 闵可夫斯基距离(Minkowski distance)(5) 汉明距离(Hamming distance)(6) 余弦相似度(Cosine Similarity) KNN算法介绍1 数据的准备2 划分训练数据和测试…

C++11 线程库

1 thread类的简单介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff0c;使得C在并行编程时不需要依赖第三方库…

利用AI倾听熊猫爱的声音,预测交配成功

大熊猫是世界上最受喜爱的动物之一。原产于中国中部和西南部的山脉&#xff0c;具有独特的黑眼睛和黑白外套的熊于1990年被列入国际自然保护联盟&#xff08;IUCN&#xff09;濒危名单。它们的地位在2016年升级为易危物种&#xff0c;世界自然基金会估计现在大约有1&#xff0c…

计算机视觉常用数据集介绍

1 MINIST MINIST 数据集应该算是CV里面最早流行的数据了&#xff0c;相当于CV领域的Hello World。该数据包含70000张手写数字图像&#xff0c;其中60000张用于train&#xff0c; 10000张用于test&#xff0c; 并且都有相应的label。图像的尺寸比较小&#xff0c; 为28x28。 数…

QTableWidget setSortingEnable 函数使用详解

Qt助手的解释 If enable is true, enables sorting for the table and immediately trigger a call to sortByColumn() with the current sort section and order Note: Setter function for property sortingEnabled. 如果将 enable 设置为 true 那么就会立即调用 sortByColum…

真正帮你实现—MapReduce统计WordCount词频,并将统计结果按出现次数降序排列

项目整体介绍 对类似WordCount案例的词频统计&#xff0c;并将统计结果按出现次数降序排列。 网上有很多帖子&#xff0c;均用的相似方案&#xff0c;重写某某方法然后。。。运行起来可能会报这样那样的错误&#xff0c;这里实现了一种解决方案&#xff0c;分享出来供大家参考…

DHCP防护原理

电脑刚连接到网络 是没有IP地址的 。 通过发送广播到DHCPO服务器。 DHCP服务器响应对应的 IP地址&#xff08;简要过程&#xff09;。 如果有人私自挂接WIFI&#xff0c;相当于DHCP服务器&#xff0c;但这个DHCP服务器是假的&#xff0c;就会引起电脑接入获取家用WIFI的地址&…

十三.redis主从复制

概念 主从复制&#xff0c;指将一台redis服务器的数据&#xff0c;复制到其它的redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。master以写为主&#xff0c;slave以读为主。 默认情况…

小研究 - 面向 Spring 的热点代码在线部署方法研究(三)

随着Spring生态不断发展,越来越先进的部署方式降低了部署的复杂度,提高了不同环境下的部署效率,但是在预生产环境下,对频繁改动的热点代码,其部署效率不是很理想,一些简单的代码修改就会引发对所有依赖服务的重新编译部署,给项目部署、运维以及测试带来很多预期之外的影响。在线…

设计模式再探——代理模式

目录 一、背景介绍二、思路&方案三、过程1.代理模式简介2.代理模式的类图3.代理模式代码4.代理模式还可以优化的地方5.代理模式的项目实战&#xff0c;优化后(只加了泛型方式&#xff0c;使用CGLIB的代理) 四、总结五、升华 一、背景介绍 最近在做产品过程中对于日志的统一…

【Git】分支管理之创建、切换、合并、删除分支以及冲突处理

目录 一、理解分支 二、创建、切换、合并分支 三、删除分支 四、冲突处理 五、合并模式 六、合并策略 七、Bug分支处理 八、强制删除分支 一、理解分支 master其实就是一个指针 &#xff0c;他指向的是主分支最近一次commit。我们可以创建新的分支&#xff0c;在新的分…