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

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.mfbz.cn/a/42832.html

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

相关文章

iview的表格添加筛选功能需要注意的问题

给table的某列添加筛选功能 在table中通过给columns数据的项&#xff0c;设置 filters&#xff0c;可进行筛选&#xff0c;filters 接收一个数组。 然后再指定一个筛选函数 filterMethod 才可以进行筛选&#xff0c;filterMethod 传入两个参数value和 row。 如果指定 filter…

Ubuntu linux安装搜狗输入法

效果图&#xff1a; 一、首先要卸载掉自带的输入法 1、以root 身份登录系统并打开终端输入&#xff1a; apt-get remove ibus-pinyin 2、如果卸载后还需要使用&#xff0c;可通过如下方法安装 以root 身份登录系统并打开终端输入&#xff1a; apt-get install ibus-pinyin …

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

^(按位异或)操作符详解

因为未知&#xff0c;所以全力以赴 目录 例1.实现两个数的交换 例2.找出单身狗 1.简单版 2.进阶版 大家好&#xff0c;我是纪宁。这篇博客介绍^操作符及使用案例。 位操作符是对操作数的二进制补码进行操作。^就是位操作符的一种&#xff0c;叫按位异或操作符。计算结果是…

《零基础入门学习Python》第055讲:论一只爬虫的自我修养3:隐藏

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 上节课我们说过了&#xff0c;有一些网站比较痛恨爬虫程序&#xff0c;它们不喜欢被程序所访问&#xff0c;所以它们会检查链接的来源&#xff0c;如果说来源不是正…

【CN-Docker】window11下Docker下开启kubernetes

1. 安装Docker 安装docker步骤如下&#xff1a; 下载Docker启用hyper-v 2.1.powershell&#xff0c;管理员运行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All安装wsl配置Docker镜像加速地址(阿里云) 4.1. "registry-mirrors": [&quo…

让GPT人工智能变身常用工具-上

1.密码生成器:GPT为您创建安全密码 想象GPT作为您的个人密码生成器,负责从头到尾为您创建复杂且安全的密码。您只需要告诉他您的密码需求,比如密码的长度,是否包含大写字母、小写字母、数字或特殊字符,他会立即为您生成一个复杂但经过深度设计的密码。 例子: 我希望您…

Selenium 修改 HTTP 请求头三种方式

目录 前言&#xff1a; 什么是 HTTP 请求头 需要更改 HTTP 请求请求头 Selenium 修改请求头 Java HTTP 请求框架 代码实战 使用反向代理 使用 Firefox 扩展 下载火狐浏览器扩展 加载火狐扩展 设置扩展首选项 设置所需的功能 完整自动化用例 前言&#xff1a; Sele…

内存函数及其模拟实现

身体扛不住的时候&#xff0c;意志会带你杀出重围 文章目录 一、memcpy函数 函数介绍 模拟实现 二、memmove函数 函数介绍 模拟实现 三、memset函数 函数介绍 模拟实现 大家好&#xff0c;我是纪宁。这篇文章给大家介绍C语言中常见的内存处理函数。 一、memcpy函数 …

blender 基础材质篇

材质展示 材质背景介绍 什么是PBR&#xff1f; PBR 全称为 Physically Based Rendering&#xff0c;译为基于物理属性的引擎渲染&#xff0c;也就是说会把物质的颜色、粗糙度、高光属性等进行分别处理&#xff0c;使物质体现出更真实的感觉&#xff1b; 什么是BRDF&#xff…

Vue.js基础简答题

系列文章目录 后续补充 文章目录 系列文章目录前言一、库与框架的区别是什么&#xff1f;二、Vue.js 的核心特性有哪些&#xff1f;三、什么是数据驱动视图&#xff1f;四、MVVM 模型各部分含义是什么&#xff0c;在 Vue.js 中分别对应哪些功能&#xff1f;五、el 选项的作用是…

安全开发-JS应用原生开发JQuery库Ajax技术加密编码库断点调试逆向分析元素属性操作

文章目录 JS原生开发-文件上传-变量&对象&函数&事件JS导入库开发-登录验证-JQuery库&Ajax技术JS导入库开发-编码加密-逆向调试 JS原生开发-文件上传-变量&对象&函数&事件 1、布置前端页面 2、JS获取提交数据 3、JS对上传格式判断 <script>…

数据仓库发展历史

数据仓库发展历史 一、演变 数据仓库是企业中用于存储、整合和分析数据的关键组件。随着时间的推移&#xff0c;数据仓库经历了三代演化&#xff1a;从需求驱动到平台化、从平台化到智能&#xff08;AI&#xff09;化 二、第一代&#xff08;过时&#xff09; 第一代数据仓…

第四讲:MySQL中DDL一些基本数据类型及表的创建、查询

目录 1、创建表:2、DDL一些基本数据类型&#xff1a; 1、创建表: 部分单词及解析&#xff1a; 1、tables:表 2、comment:评论&#xff0c;解释 3、gender:性别 4、neighbor&#xff1a;邻居 1、创建表&#xff1a;&#xff08;注&#xff1a;在自定义数据库操作&#xff0c;…

【itext7】itext7操作PDF文档之添加表单控件(单行文本框、多行文本框、单选框、复选框、下拉框、按钮)

这篇文章&#xff0c;主要介绍itext7操作PDF文档之添加表单控件&#xff08;单行文本框、多行文本框、单选框、复选框、下拉框、按钮&#xff09;。 目录 一、itext操作PDF表单 1.1、添加单行文本框 1.2、添加多行文本框 1.3、添加单选框 1.4、添加复选框 1.5、添加下拉框…

Pytorch迁移学习使用Resnet50进行模型训练预测猫狗二分类

目录 1.ResNet残差网络 1.1 ResNet定义 1.2 ResNet 几种网络配置 1.3 ResNet50网络结构 1.3.1 前几层卷积和池化 1.3.2 残差块&#xff1a;构建深度残差网络 1.3.3 ResNet主体&#xff1a;堆叠多个残差块 1.4 迁移学习猫狗二分类实战 1.4.1 迁移学习 1.4.2 模型训练 1.…

(css)滚动条样式

(css)滚动条样式 效果&#xff1a; /*滚动条整体样式*/ ::-webkit-scrollbar {width: 2px;/*高宽分别对应横竖滚动条的尺寸*/height: 10px; } ::-webkit-scrollbar-thumb {/*滚动条里面小方块*/border-radius: 10px;width: 2px;height: 60px;background: linear-gradient(0deg,…

CentOS7系统MBR、GRUB2、内核启动流程报错问题

目录 &#x1f969;Linux启动流程 &#x1f969;MBR修复 &#x1f36d;1、模拟损坏 &#x1f36d;2、重启测试 &#x1f36d;3、修复MBR &#x1f36d;4、测试系统 &#x1f969;GRUB2修复 &#x1f36d;1、模拟损坏 &#x1f36d;2、修复GRUB2 &#x1f36d;3、测试系统 &…

03. 自定义镜像 Dockerfile

目录 1、前言 2、构建镜像的方式 2.1、docker commit 2.1.1、先查看下当前的容器 2.1.2、生成该容器镜像 2.1.3、查看镜像列表 2.2、Dockerfile 2.2.1、创建Dockerfile文件 2.2.2、编写Dockerfile文件 2.2.3、构建镜像 2.2.4、使用该镜像生成容器 3、Dockerfile 3…

GO内存模型(同步机制)

文章目录 概念1. 先行发生 编译器重排同步机制init函数协程的创建channelsync 包1. sync.mutex2. sync.rwmutex3. sync.once atomic 参考文献 概念 1. 先行发生 The happens before relation is defined as the transitive closure of the union of the sequenced before and …
最新文章