当前位置: 首页 > news >正文

【Spring学习之更简单的读取和存储Bean对象】教会你使用五大类注解和方法注解去存储 Bean 对象

前言:
💞💞今天我们依然是学习Spring,这里我们会更加了解Spring的知识,知道Spring是怎么更加简单的读取和存储Bean对象的。也会让大家对Spring更加了解。
💟💟前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员

个人主页⭐: 书生♡
gitee主页🙋‍♂:奋斗的小白
博客领域💥:java编程 ,前端,算法,强训题目
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬

在这里插入图片描述

目录

  • 1.存储 Bean 对象
    • 1.1配置路径
    • 1.2 存储 Bean 对象的两种方式
    • 1.3 存储 Bean 对象-----类注解
      • 1.3.1 @Controller(控制器存储)
      • 1.3.2 @Service(服务存储)
      • 1.3.3 @Repository(仓库存储)
      • 1.3.4 @Component(组件存储)
      • 1.3.5 @Configuration(配置存储)
    • 1.4 存储 Bean 对象-----方法注解
      • 1.4.1 使用方法注解@Bean
      • 1.4.2 方法注解的重命名
    • 1. 5 Bean的命名
    • 1.6 类注解的具体讲解
      • 1.6.1 为什么要有五个类注解
      • 1.6.2 五大类注解的用途(重点)
      • 1.6.3类注解之间的关系

1.存储 Bean 对象

 上一篇文章,已经教会大家怎么去存储Bean对象了,但是会发现比较麻烦,所以这篇文章会教会大家怎么更加简单的去存储Bean对象。

在 Spring 中想要更简单的存储和读取对象的核⼼是使⽤注解,也就是我们接下来要学习 Spring 中的相 关注解,来存储和读取 Bean对象。

1.1配置路径

在上一篇文章中,我们存储 Bean 时,需要在 spring-config 中添加⼀⾏ bean 注册内容才⾏。
在这里插入图片描述
但是会发现当我们需要注入多个类的时候,就会添加很多的Bean标签,会很麻烦,那有什么可以解决吗?
我们可以使用一行代码就去解决这个问题。

在我们的spring-config.xml中添加一行代码。
在这里插入图片描述

再添加这个代码的时候需要注意:一定要配置包路径,就是上图的标注的位置。
我们需要配置⼀下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 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="Spring.demo"></content:component-scan>
</beans>

有人就会问了,我不用包行不行,直接在根目录下创建一个类,是可以的,那么我们就需要这个位置不用写包的路径,写上两个**,就可以了,这个就代码扫描全部的。但是不建议这样写,因为我们以后再公司的时候,一定会有这样的路径的,所以建议大家在这里还是写在包的下面,更规范些。

1.2 存储 Bean 对象的两种方式

我们通过注解来存储对象在Spring中,有两种方式:

1.类注解:@Controller、@Service、@Repository、@Component、@Configuration。
2.方法注解:@Bean

下面为大家分别讲讲这两种方式。

1.3 存储 Bean 对象-----类注解

我们知道存储Bean对象有五种类注解。

@Controller 控制器
@Service 服务
@Repository 仓库
@Component 组件
@Configuration 配置

下面为大家分开说说这五种类注解。(重点是前三个)

1.3.1 @Controller(控制器存储)

我们在使用类注解的时候,类注解全部都是在类的上面的,因为我们是想将对象存储到 Spring 中,整个类就是一个对象,所以在类的上面。
在这里插入图片描述

使⽤ @Controller 存储 bean 的代码展示:

	@Controller//将对象存储到 Spring 中public class ApplicController {public  String hello(){return "Hello Spring !!!!";}}public static void main(String[] args) {//1.获取Spring对象(上下文)ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");//2.取出bean对象//(3)根据Bean名称(标识)+类型 来得到BeanApplicController applicController =context.getBean("applicController", ApplicController.class);//3.使用beanSystem.out.println(applicController.hello());}

在这里插入图片描述

1.3.2 @Service(服务存储)

这个和上面的一样,在类上面添加一个注解,@Service
在这里插入图片描述
使⽤ @Service 存储 bean 的代码展示:

@Service
public class ApplicController {public  String hello(){return "Hello Spring !!!!";}
}

其他的代码和上面的一样就不写了。这个也是可以运行成功的。
在这里插入图片描述

1.3.3 @Repository(仓库存储)

这个和上面的一样,在类上面添加一个注解,@Repository
在这里插入图片描述
使⽤ @Repository存储 bean 的代码展示:

@Repository
public class ApplicController {public  String hello(){return "Hello Spring !!!!";}
}

其他的代码和上面的一样就不写了。这个也是可以运行成功的。
在这里插入图片描述

1.3.4 @Component(组件存储)

这个和上面的一样,在类上面添加一个注解,@Component(这个用的比上面三个会少一些)
在这里插入图片描述
使⽤ @Component存储 bean 的代码展示:

@Component
public class ApplicController {public  String hello(){return "Hello Spring !!!!";}
}

其他的代码和上面的一样就不写了。这个也是可以运行成功的。

1.3.5 @Configuration(配置存储)

这个和上面的一样,在类上面添加一个注解,@Configuration(这个使用会更少一点)
在这里插入图片描述

使⽤ @Configuration存储 bean 的代码展示:

@Configuration
public class ApplicController {public  String hello(){return "Hello Spring !!!!";}
}

其他的代码和上面的一样就不写了。这个也是可以运行成功的。

1.4 存储 Bean 对象-----方法注解

在这里插入图片描述

1.4.1 使用方法注解@Bean

类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的。

那么为什么要引入方法呢?

1:因为一个类中可能会有很多个方法,但是我并不全部都需要引入到Spring,如果使用类注解,那么就是将整个类注入Spring中,耽误性能,所以使用方法注解,需要哪个方法就将那个方法注入
2.如果一个类中出现了两个同样的方法,那么实用类注解的时候,不知道去取一个,那么就需要使用方法注解的name属性去区分了。

@Controller
public class StudentBeans {@Beanpublic Student student1() {// 伪代码,构建对象Student stu = new Student();stu.setId(1);stu.setName("张三");stu.setAge(18);return stu;}
}

注意:
在 Spring 框架的设计中,⽅法注解 @Bean 要配合类注解才能将对象正常的存储到 Spring 容器中
如果单独使用方法注解,会报错的
在这里插入图片描述

1.4.2 方法注解的重命名

我们可以通过设置 name 属性给 Bean 对象进⾏重命名操作

格式为:
@Bean({“名称”})
这个重命名的 name 其实是⼀个数组,⼀个 bean 可以有多个名字,每一个名称用双引号括起来,用逗号分开。

注意事项:
当给@Bean设置了name属性之后,使用原方法名就不能获取到对象了,只能使用设置的名称才能获取。

在这里插入图片描述
此时我们使⽤我们自定义的名称就可以获取到 对象了

@Controller
public class StudentBeans {@Beanpublic Student student1() {// 伪代码,构建对象Student stu = new Student();stu.setId(1);stu.setName("张三");stu.setAge(18);return stu;}@Bean({"s1","s2"})public Student student2() {// 伪代码,构建对象Student stu = new Student();stu.setId(2);stu.setName("李四");stu.setAge(20);return stu;}}//另外一个启动类中
public static void main(String[] args) {//1.获取Spring对象(上下文)ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");//2.取出bean对象Student student =context.getBean("student1",Student.class);System.out.println(student);System.out.println("===========");Student stu =context.getBean("s1",Student.class);System.out.println(stu);System.out.println("===========");//Student stu1 =context.getBean("student2",Student.class);//这种是错误的//System.out.println(stu1);}

1. 5 Bean的命名

我们在spring-config.xml中引入了,这么一段代码,我们就可以不使用bean标签了,但是我们会发现没有了id这个属性了,那我们在获取Bean对象的时候怎么办,如果只使用类名的话就会出现问题。

在这里插入图片描述
其实当我们类名首字母是大写的是,默认将类名的首字母小写,就是我们的id标识了。
在这里插入图片描述

这个时候我们就会有几个疑问:

问题1.如果类名首字母是小写,要怎么从Spring中获取Bean?
答:和首字母是大写是一直的,都是用的是将类名首字母小写的方式来获取对象。

在这里插入图片描述

问题2:如果首字母和第二字母都是大写,会怎样?
答:当使用默认规则,首字母小写获取Bean对象时,失败了!
正确获取Bean的方式是使用原类名,就能成功获取到了。

在这里插入图片描述

问题3:项目中没有目录,所有的类都写在 java根路径下,怎么存、取 Bean对象?
答:我们只需要改一下配置文件的包路径就行,将路径改为**

在这里插入图片描述

1.6 类注解的具体讲解

1.6.1 为什么要有五个类注解

1.通过类注解可以了解当前类的用途(就好像看到一个东西就知道这是哪里的,具有很强的识别性)
2.功能有细微不同:这个在 Spring MVC/Spring Boot再详细展开。

1.6.2 五大类注解的用途(重点)

1.@Controller(控制器)∶归属于业务逻辑层,用来控制用户的行为,它用来检查用户参数的有效性。
2.@Service(服务):归属于服务层,调用类实现相应的功能。【不直接和数据库交互的,它类似于控制中心】
3.@Repository(仓库):归属于持久层,是直接和数据库进行交互的。通常每一个表都会对应一个@Repository。
4.@Configuration(配置)∶归属于配置层,是用来配置当前项目的一些信息。
5. @Component(组件):归属于公共工具类,提供某些公共方法。

在这里插入图片描述

1.6.3类注解之间的关系

先来看一下这五个类注解的源代码,可以发现每一个类注解都有一个@Componen,
这个就表明@Componen是他们的父类
在这里插入图片描述

相关文章:

【Spring学习之更简单的读取和存储Bean对象】教会你使用五大类注解和方法注解去存储 Bean 对象

前言&#xff1a; &#x1f49e;&#x1f49e;今天我们依然是学习Spring&#xff0c;这里我们会更加了解Spring的知识&#xff0c;知道Spring是怎么更加简单的读取和存储Bean对象的。也会让大家对Spring更加了解。 &#x1f49f;&#x1f49f;前路漫漫&#xff0c;希望大家坚持…...

微客云原生淘宝客APP小程序系统如何定制

淘宝是中国最大的电商网站&#xff0c;而淘宝的火热&#xff0c;也兴起了一个全新的行业&#xff0c;淘宝客。就是帮助淘宝商家推广商品的一种职业。目前淘宝每年有百分之10的销售业绩都是通过淘宝客贡献的&#xff0c;所以说淘宝客的市场越来越大。但是淘宝客要推广自己的产品…...

QT CTK插件开发(六) 多对一插件

CTK在软件的开发过程中可以很好的降低复杂性、使用 CTK Plugin Framework 提供统一的框架来进行开发增加了复用性 将同一功能打包可以提供多个应用程序使用避免重复性工作、可以进行版本控制提供了良好的版本更新迭代需求、并且支持动态热拔插 动态更新、开发更加简单快捷 方便…...

【Spring Boot整合MyBatis教程】

Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发展的快速应用开发…...

ThinkPHP3.2.3通过局域网手机访问项目

折腾一上午&#xff0c; 试了nginx&#xff0c; 试了修改Apache的httpd.conf 试了关闭代理 试了手动配置网络 试了关闭防火墙 试了添加防火墙入站出站规则 问了五个ChatGPT 都没解决。 记录一下 wampserver3.0.4 Apache2.4.18 PHP 5.6.19 MySQL 5.7.11 所有服务启…...

2306C++虚继承

构 B{无序映<串,串>列;整 大小0;空 f(){大小;} }; //虚继承其实不错,但是占位置,占空间.构 C:虚 公 B{空 g(){} };构 D:虚 公 C{空 h(){} }; 构 S{}; 构 T{}; //元<类 T>构 E:虚 公 D{}; 构 E:虚 公 D{};空 主(){//E<S>e;e.f();打印(e.大小);//E<T>m;m…...

使用oracle遇到问题笔记

一、oracle还原到不同版本的oracle数据库报错和解决办法 产生&#xff1a;执行imp导入dmp备份文件时报错 错误内容&#xff1a;导入失败提示&#xff1a;“不是有效的导出文件, 标头验证失败”解决方法 解决办法&#xff1a;http://t.csdn.cn/pJyhc...

我和老刘又被搞惨了

前两天在调试PHY的时候遇到了一堆问题&#xff0c;老刘都不耐其烦的搞定了&#xff0c;这次我们开始调试音频部分&#xff0c;音频部分很简单&#xff0c;无非就是录音&#xff0c;要是能把录音的音频拿到了&#xff0c;那就万事大吉了。老刘也是信心满满&#xff0c;老刘对我说…...

DDD--基本概念

最近项目组一直在推DDD领域驱动设计&#xff0c;现就一些个人理解分享如下。 DDD&#xff08;领域驱动设计&#xff09;是一种软件开发方法论&#xff0c;旨在解决复杂业务场景下的软件设计与开发问题。以下是DDD的基本概念&#xff1a; 领域&#xff08;Domain&#xff09;&…...

chatgpt赋能python:Python多行注释

Python 多行注释 在 Python 中&#xff0c;我们经常需要写注释来解释代码或者用于调试。Python 的注释分为单行注释和多行注释&#xff0c;本文主要介绍 Python 中如何多行注释。 单行注释 在 Python 中&#xff0c;单行注释以符号 # 开头&#xff0c;可以写在代码的任何位置…...

JSP详细基础教学

目录 前言 环境设置 创建JSP文件 编写基本的JSP代码 部署和运行JSP页面 基础语法 前言 JSP&#xff08;JavaServer Pages&#xff09;是一种用于开发动态网页的Java技术。它允许将Java代码嵌入HTML页面中&#xff0c;以便在服务器端生成动态内容。在本次教程中&#xff…...

mysql修改登录用户的密码

文章目录 mysql5.7即mysql7.0 的修改方式mysql5.8即mysql8.0的修改方式如果修改完密码&#xff0c;发现旧密码和新密码都登录不进来怎么办&#xff1f;发现设置密码老报错 mysql5.7即mysql7.0 的修改方式 1.如果是使用docker里装的mysql 首先使用 [rootlocalhost /]# docker p…...

SNAT和DNAT

SNAT和DNAT 一、SNAT的策略及应用&#xff1a; 1.SNAT&#xff1a; &#xff08;1&#xff09;定义&#xff1a;又称源地址转换。源地址转换是内网地址向外访问时&#xff0c;发起访问的内网ip地址转换为指定的ip地址&#xff08;可指定具体的服务以及相应的端口或端口范围&…...

好程序员:月薪2万程序员的简历,原来长这个样子!

6月份现在正是招聘季节&#xff0c;不少同学java岗位投递不少&#xff0c;但回复不多&#xff0c;根本原因可能是java面试简历不够吸引人。 你的java简历不会写&#xff1f;看看别人就知道咋写了&#xff0c;这里给大家拆解一份好程序员月薪2万的java简历。 java自我评价模块&a…...

STM32之FreeRTOS

目录 FreeRTOS 介绍 什么是 FreeRTOS &#xff1f; 为什么选择 FreeRTOS ? FreeRTOS 资料与源码下载 祼机开发与 FreeRTOS 祼机开发&#xff1a; FreeRTOS&#xff1a; FreeRTOS 实现多任务的原理 二、移植 FreeRTOS 手动移植 使用CubeMX快速移植 快速移植流程…...

有趣的图(二)(56)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 咱们书接上回&#xff0c;上次学了图的基本概念&#xff0c;你都学会了吗&#xff1f; 咱们今天要学习内容如下&a…...

Linux之环境变量

目录 Linux之环境变量 分类 环境变量 定义 设置环境变量 设置环境变量&#xff08;永久&#xff09; 用户环境变量配置所在文件&#xff1a; 全局环境变量配置所在文件&#xff1a; 显示与取消环境变量 通过echo或printf打印环境变量 通过env或set显示默认的环境变量 用 …...

python带你制作自动点赞小程序,让我看看谁还在呆呆的手动点赞

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 知识点: 动态数据抓包 requests发送请求 开发环境: 代码所使用软件工具&#xff1a; python 3.8 >>>>>> 运行代码 pycharm 2022.3 >>>>>> 辅助敲代码 需下载的第三方模块&a…...

shell脚本编写辅助命令

目录 一、echo 命令 二、字符串相关操作 1.截取字符串 2.获取字符串长度 3.字符串追加字符 4.从开头或结尾删除字符串指定格式内容 三、随机数 1.使用 $RANDOM 2.指定RANDOM变量的范围 &#xff08;1&#xff09;从0开始的范围 &#xff08;2&#xff09;从指定数始…...

高并发编程:线程池

一、概述 线程池首先有几个接口先了解第一个是Executor&#xff0c;第二个是ExecutorService&#xff0c;在后面才是线程池的一个使用ThreadPoolExecutor。 二、Executor Executor看它的名字也能理解&#xff0c;执行者&#xff0c;所以他有一个方法叫执行&#xff0c;那么执…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...