【JavaEE】Spring中注解的方式去存储Bean对象

news2024/11/24 2:02:35

Spring的开发要点总结

在这里插入图片描述

文章目录

  • 【JavaEE】Spring的开发要点总结(2)
    • 1. 通过类注解的方式存储Bean对象
      • 1.1 五大 类注解
        • 1.1.1 @Controller 控制器存储
        • 1.1.2 @Service 服务存储
        • 1.1.3 @Repository 仓库存储
        • 1.1.4 @Component 组件存储
        • 1.1.5 @Configuration 配置存储
      • 1.2 Bean对象的名字
        • 1.2.1 注解加参数
        • 1.2.2 注解不加参数(默认情况下的名字)
        • 1.2.3 其他的注解什么情况
    • 2. 通过方法注解@Bean的方式存储Bean对象
      • 2.1 创建一个不含类注解的实体类
      • 2.2 方法注解的使用规则
      • 2.3 Bean对象的名字
        • 2.3.1 注解不加参数(默认情况下的名字)
        • 2.3.2 注解加参数
        • 2.3.3 方法注解重名问题

【JavaEE】Spring的开发要点总结(2)

Spring的开发要点总结(1)博客传送门:【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取_s:103的博客-CSDN博客

在这里插入图片描述

在上一篇文章中,可见Bean对象的存储和获取还是有点麻烦,这一篇文章的重点就在于简化这个过程~

  • 在JavaEE的学习中,要实现一个功能,要先考虑有没有实现对应功能的一个 注解,在JavaEE进阶中,注解的使用很常见~
  • 对于注解,它是可以实现一定业务逻辑的东西

1. 通过类注解的方式存储Bean对象

在配置文件里配置一个组件:

  • 没有这个,就内部代码就不知道扫描哪里,从而无法通过类注解存储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.bit.service"></content:component-scan>
</beans>

在这里插入图片描述

beans的属性与原配置的属性也不同哦

在这里插入图片描述

这个属性的值的含义就是,扫描的路径

如果不填写base-package属性,默认情况下会扫描配置文件所在包及其子包下的组件。但为了避免不必要的不确定性,建议明确指定需要扫描的包路径。

你可以在<context:component-scan>标签的base-package属性中指定多个扫描路径。可以使用逗号(,)或分号(;)将多个路径分隔开。

在这里插入图片描述

  • 我填写的是:com.mara.demo~

而扫描路径下,如果加了类注解的类,就会存储一个Bean对象到Spring里

  1. @Controller
  2. @Service
  3. @Repository
  4. @Component
  5. @Configuration

这样做不会有一些不必要的开销,因为一个项目的类特别多,没必要每个类都扫描到,每个类都有Bean对象存储到Spring里

1.1 五大 类注解

1.1.1 @Controller 控制器存储

在这里插入图片描述

【控制器】,重要作用就是校验参数的合法性(安检系统)

1.1.2 @Service 服务存储

在这里插入图片描述

【服务】业务组装(客服中心)

  • 就是一些业务逻辑代码,它只是调用一些方法,然后去实现“逻辑”,但是并没有实质去实现那些“持久化数据的操作”

1.1.3 @Repository 仓库存储

在这里插入图片描述

【数据持久层】DAO层,实际的业务处理

1.1.4 @Component 组件存储

在这里插入图片描述

【组件】工具类层(基础的工具)

1.1.5 @Configuration 配置存储

在这里插入图片描述

【配置】配置层

  • 在之前的项目开发里也很常见地需要配置一些依赖啥的~
  • 配置版本号~

而我们以后做项目也要讲代码进行分类,是这五种中的哪一种,就放到对应的包里,而包里面java类的类注解就是对应功能的类注解

程序的工程分层图:
在这里插入图片描述

1.2 Bean对象的名字

Bean对象的类理所当然就是对应的类

那么Bean对象怎么命名呢?

1.2.1 注解加参数

在这里插入图片描述

运行结果:

  1. 获取并使用

在这里插入图片描述

  1. 不获取不使用

在这里插入图片描述

可见,配置文件被识别的时候,就会扫描对应的路径,把Bean存储起来~

  1. 不加注解
    • 连名字都不可能有

在这里插入图片描述

  1. 其他的命名方式(value)

在这里插入图片描述

结果一样

初步来看,Bean对象的名字可以通过注解后面添加参数来规定

  • 并且不能有多个名字

1.2.2 注解不加参数(默认情况下的名字)

(括号加不加都一样)

在这里插入图片描述

在这里插入图片描述

运行结果:

在这里插入图片描述

居然可以,难道是大驼峰变小驼峰就行了?

在这里插入图片描述

加粗样式

好像又不是~

改为类名:

在这里插入图片描述

又可以了~

我认为是这样的,有一些大驼峰,前两个字母都是大写的情况,有可能是本来就是缩写的形式,变成小驼峰不美观,然后也不能全小写(可能会显示拼写错误)

所以干脆就是类名了~

在这里插入图片描述

  • 对于不规范的类名
    • 小驼峰->小驼峰

总结:

  1. 第一个字母大写,第二个字母小写,默认名就是小驼峰
  2. 前两个字母都大写,默认名就是类名
  3. 小驼峰,则依旧是小驼峰

补充:

  • 一个类的类注解生成的Bean对象就一个,因为名字就一个,默认的名字会给的参数被替换~

在这里插入图片描述

在这里插入图片描述
源代码:

shift shift:

在这里插入图片描述

  • 注解相关的

一路走过去:

在这里插入图片描述

  • 符合刚才的规则

在这里插入图片描述

而这个包就是jdk中的一个,也就是说不上Spring发展而当生的

  • 也就是java中的一种命名方式~

在这里插入图片描述

1.2.3 其他的注解什么情况

其他的注解的结果都是一样的~

  • 目前我们的认知就区分这些注解为,设计代码是为了不同的“初心”吧~

在这里插入图片描述

  • 其他四个注解都是Component的子类~

2. 通过方法注解@Bean的方式存储Bean对象

2.1 创建一个不含类注解的实体类

在model(实体类 -> 数据库的表的字段的模型)包中,

在这里插入图片描述

获得Getter和Setter

在这里插入图片描述

生成一个toString方法~

在这里插入图片描述

创建一个类,去使用方法注解:

在这里插入图片描述

2.2 方法注解的使用规则

在这里插入图片描述

  • 将当前方法返回的对象存储到 IoC 容器中~

接下来我在这个方法中去填写一些“伪代码”:

在这里插入图片描述

  • 这边是个伪代码,我们只体现它返回的对象会存储到容器中
  • 后续再规范的去写(不使用手动new)
    • 我们学完一些基础知识,才能串起来~

2.3 Bean对象的名字

2.3.1 注解不加参数(默认情况下的名字)

在APP类中去测试:

  • 猜测:跟类注解的一样?

在这里插入图片描述

运行结果:

在这里插入图片描述

没找到~

是名字错了吗?

  • 不是,是因为通过配置文件,没扫描到那个地方
  • 也就是说,在获取Bean对象的时候,并没有获取@Bean下方法返回的对象

因为需要一个“五大类注解”

  • <content:component-scan base-package="com.mara.demo"></content:component-scan>
    
  • 这个的规则就是在指定的目录下扫描带有注解的类

    • 之后才能扫描到带@Bean的方法~
    • 方法在项目中是特别多的,如果不这样,那肯定开销特别大,性能特别低!

即,@Bean必须配合五大类注解使用

在这里插入图片描述

  • 五个中的其中一个~
  • 这个对象通常是个组件,所以用Component,对应这五个在项目中的定位,现在比较模糊,但是以后就会很明确了,现在不了解以后了解!

运行结果:
在这里插入图片描述

  • 咋都是默认值呢?

因为注解加在实体类那了,我们获取到的则是类注解方式存储的Bean对象~

我们要在@Bean所在的类进行类注解:

在这里插入图片描述

运行结果:

在这里插入图片描述

那么这个命名规则就是跟前面的一样吗?

  • 并不是,此处的命名规则是:方法名

在这里插入图片描述

运行结果:

在这里插入图片描述

  • 找到Article的类注解存储的Bean对象~

在这里插入图片描述

  • 找到了~

疑问:那么重载方法咋办?

不能出现重载方法,因为通过方法注解获取的对象,默认都是没有参数列表的,自然无法调用其重载方法,自然就无法存储Bean对象~

2.3.2 注解加参数

对了,无论是哪里,注解中的字符串千万别是空!

在这里插入图片描述

  1. 直接写字符串
  2. name = “…”
  3. value = “…”
  4. value/name = {“…”, “…”, …}

前三种本质是一样的,第四种方式则比较特殊,是一个Bean对象,多个名,而且每个名字指的是同一个对象~

  • 字符串数组为空,则代表没填~
  • 类注解存储方式是没有第二和第四种方法

在Bean的源代码也能看出来(即使你看不懂,就猜一下):

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行结果:

在这里插入图片描述

在这里插入图片描述

运行结果:

在这里插入图片描述

  • 我并没有重写equals和使用equals方法,所以这true就代表引用的指向是一样的!

而用参数去命名的话,原来的默认命名被覆盖~

在这里插入图片描述

这种方式 Spring 存储 Bean 的逻辑结构是:

在这里插入图片描述

2.3.3 方法注解重名问题

对于类注解的方式,由于就一个类,所以不会重名

但是对于方法注解,就可以有多个方法,返回同一个类的对象,而不同的方法是不同的Bean对象,如果他们重名咋办?

在这里插入图片描述

运行结果:

在这里插入图片描述

  • 而且不是巧合

  • 并不会报错~

这是跟加载顺序和权重有关的~

  • 加载顺序,可通过@Order去间接定义,@Order参数值小的要更先加载
    • 在Spring容器中,如果多个Bean使用相同的名称,后续的Bean定义将会覆盖之前的Bean定义。 这意味着只有最后一个定义的Bean会被存放到容器中,并与该名称关联起来。之前的Bean定义将会被覆盖,并且无法再通过该名称获取到之前的Bean。
    • 这个方法适用于不同类的Bean对象
    • 不适用于同一个类的Bean对象,这个跟代码顺序有关~

同一个类中:

在这里插入图片描述

运行结果:

在这里插入图片描述
尽管你在@Bean方法上使用了@Order注解,但最终的加载顺序仍然由Spring容器的实现决定,而不是由@Order注解决定。这意味着无法确保art1()方法必定在art2()方法之前加载。

不同类:

在这里插入图片描述

在这里插入图片描述

运行结果:

在这里插入图片描述

在这里插入图片描述

运行结果:

在这里插入图片描述

但是,总的来说,重名是不合理的,不要写成这样!


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

代码链接:SpringDemo2/src/main · 游离态/马拉圈2023年7月 - 码云 - 开源中国 (gitee.com)

本文讲解了注解方式存储Bean的方法,是不是更方便了呢?


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

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

相关文章

对比CahtGPT Bard Claude2对中文的理解

对比CahtGPT Bard Claude2对中文的理解 今天简单测试了一下目前这三个很火的模型对中文的理解能力 简单问题 鲁迅和周树人的关系 Bard CahtGPT Claude 介绍一下平凡的世界这本书 Bard CahtGPT

ES6 (js)

学习了很多vue的视频&#xff0c;还有nuxt的&#xff0c;还是不会。 还是要学ES6 本文的大部分出自小马老师的资料&#xff0c;还有曾大佬的文章 变量&#xff08;Let 和 const&#xff09; 在es6中&#xff0c;多用let 和const 来声明变量类型。因为var 会提前声明&#xff0…

【JDBC系列】- 核心API之preparedstatement用法

核心API之preparedstatement用法 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;…

docker学习笔记——狂神说视频学习笔记

Ubuntu上docker安装 UBUNTU 20.04 LTS 安装DOCKER看高博主的博文&#xff0c;一键复制命令安装即可。 docker命令 docker version查看你docker版本信息 docker info显示docker系统级别的信息 docker --helpdocker命令查询 docker docs的referrence介绍了docker的详细命令 …

chrome查看浏览器内核日志

由于经常在网页上调试播放音视频&#xff0c;但是总遇到一些未知原因&#xff0c;导致无法正常播放&#xff0c;亟需查看浏览器内核日志&#xff0c;分析原因&#xff0c;做一下笔记。 (1) 查看浏览器快捷键属性 &#xff08;2&#xff09;在快捷键启动位置补充参数 --enable-…

[ 容器 ] Docker 的数据管理

目录 一、Docker 的数据管理1.1 数据卷2. 数据卷容器 二、 端口映射三、容器互联&#xff08;使用centos镜像&#xff09;四、Docker 镜像的创建1&#xff0e;基于现有镜像创建2&#xff0e;基于本地模板创建3&#xff0e;基于Dockerfile 创建3.1 联合文件系统&#xff08;Unio…

vue3前端分页,全选翻页状态保持

直接贴代码&#xff0c;代码中有注释 <template><div class"viewer-container" id"viewer-container"><!-- 表格 --><el-table:row-key"getRowKeys":data"data.tableDataCopy"style"width: 100%"ref&…

Go语言开发小技巧易错点100例(八)

往期回顾&#xff1a; Go语言开发小技巧&易错点100例&#xff08;一&#xff09;Go语言开发小技巧&易错点100例&#xff08;二&#xff09;Go语言开发小技巧&易错点100例&#xff08;三&#xff09;Go语言开发小技巧&易错点100例&#xff08;四&#xff09;Go…

Linux网络--UDP套接字

文章目录 预备知识socket套接字UDP网络编程 一、预备知识 1.源IP地址和目的IP地址 IP地址&#xff1a;标识计算机在网络中的唯一性。 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址。 源IP地址 &#xff1a; 网络通信的发起者。 目的IP地址 &#xff1a; …

element ui 上传控件携带参数到后端

1.携带固定参数&#xff1a; 2.携带不固定参数&#xff1a; <el-row> <el-col :span"24"> <el-upload :multiple"false" :show-file-list"false" :on-success"f_h…

矿井人员视频行为分析算法 opencv

矿井人员视频行为分析算法通过opencvpython网络模型技术&#xff0c;矿井人员视频行为分析算法实时监测人员的作业行为&#xff0c;并与安全标准进行比对&#xff0c;可以及时发现不符合安全要求的行为&#xff0c;预防事故的发生。OpenCV的全称是Open Source Computer Vision …

json-server Node.js 服务,前端模拟后端提供json接口服务

json-server Node.js 服务,前端模拟后端提供json接口服务 背景&#xff1a; 前后端分离的项目&#xff0c;如果前端写页面的话&#xff0c;必须的后端提供接口文件&#xff0c;作为前端等待时间太久&#xff0c;不便于开发进行&#xff0c;如果前端写的过程中自己搭建一个简要的…

vue3+taro+Nutui 开发小程序(一)

前言&#xff1a;最近在调研开发小程序&#xff0c;发现现在taro框架逐渐成熟&#xff0c;能完美地使用vue3来进行开发&#xff0c;调研中发现京东的Nutui也不错所以准备写一个由0到1的vue3taroNutui的小程序。 这篇我们首先搭建一个框架&#xff1a; vscode插件准备环节&…

【C++详解】——异常

目录 C语言传统的处理错误的方式 C异常概念 异常的使用 异常的抛出和捕获 异常的重新抛出 异常安全 异常规范 自定义异常体系 C标准库的异常体系 异常的优缺点 C语言传统的处理错误的方式 传统的错误处理机制 终止程序&#xff0c;如assert。缺陷&#xff1a;用户难…

国产化测试工具的特色有哪些?

在软件开发和系统运维过程中&#xff0c;测试工具的选择和应用对于确保软件质量和系统稳定性至关重要。随着我国信息技术的快速发展&#xff0c;国产化测试工具以其独特的特色在市场上崭露头角。那国产化测试工具的特色有哪些&#xff1f; 一、技术创新&#xff1a; 适应多样化…

在英特尔 CPU 上微调 Stable Diffusion 模型

扩散模型能够根据文本提示生成逼真的图像&#xff0c;这种能力促进了生成式人工智能的普及。人们已经开始把这些模型用在包括数据合成及内容创建在内的多个应用领域。Hugging Face Hub 包含超过 5 千个预训练的文生图 模型。这些模型与 Diffusers 库 结合使用&#xff0c;使得构…

【Qt】安装Qt 5.7.1 MSVC2013 64bit版本的说明

【Qt】安装Qt 5.7.1 MSVC2013 64bit版本的说明 1、背景2、安装Qt 5.7.13、运行Qt Creator 1、背景 刚开始Qt是C库&#xff0c;后来Qt发展就越来越强大了。后来Qt 发展成为一套跨平台C图形用户界面应用程序开发框架。 注意它不但可以开发GUI程序&#xff0c;而且也可用于开发非…

【数据架构】Data Fabric 架构是实现数据管理和集成现代化的关键

D&A 领导者应该了解数据编织架构的关键支柱&#xff0c;以实现机器支持的数据集成。 在日益多样化、分布式和复杂的环境中&#xff0c;数据管理敏捷性已成为组织的任务关键优先事项。为了减少人为错误和总体成本&#xff0c;数据和分析 (D&A) 领导者需要超越传统的数据…

LangChain+LLM大模型问答能力搭建与思考

1. 背景 最近&#xff0c;大模型&#xff08;LLMs&#xff0c;Large Language Models&#xff09;可谓是NLP领域&#xff0c;甚至整个科技领域最火热的技术了。凑巧的是&#xff0c;我本人恰好就是NLP算法工程师&#xff0c;面临着被LLMs浪潮淘汰的窘境&#xff0c;决定在焦虑…

【趟坑记录】d3.zoom()的正确使用姿势 @d3.v7

【趟坑记录】d3.zoom()的正确使用姿势 d3.v7 文章目录 【趟坑记录】d3.zoom()的正确使用姿势 d3.v7问题重现原因分析解决方案放缩平移写法特殊修改transform函数的写法 总结 在开发一个D3应用的时候遇到了一个 zoom相关的问题&#xff0c;记录解决思路与方案 问题重现 最近在…