Java【Spring】使用类注解和方法注解, 更简单的存储和获取 Bean

news2024/10/5 17:20:08

文章目录

  • 前言
  • 一、存储 Bean
    • 1, 配置文件
    • 2, 五大类注解
      • Bean 的命名规则
    • 3, 方法注解
      • Bean 的命名规则
  • 二、获取 Bean
    • 1, 属性注入
    • 2, Setter 注入
    • 3, 构造方法注入
    • 4, @Autowired 和 @Resource 的区别
    • 5, 同一个类型的多个 Bean 注入问题
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

Spring 中有很多注解, 来帮助我们更加方便, 高效的编写代码, 本篇介绍存储和获取 Bean 时使用到的注解
在这里插入图片描述


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、存储 Bean

上篇文章 介绍了基本的存储和获取 Bean 的方式, 如果按照上篇文章介绍的方式存储Bean, 那么每存储一个 Bean 就需要在配置文件中写一行标签, 十分麻烦, 其实有一种更方便的方式, 我们可以配置存储对象的扫描包路径, 只有被配置的包下的所有类, 并且添加了注解 才能被正确的识别并保存到 Spring 中

1, 配置文件

<?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"></content:component-scan>
</beans>
  • resources 目录下新建一个 .xml 文件, 把上述代码拷贝到其中
    在这里插入图片描述
    指定了要扫描的包之后, 只有这个包, 以及这个包下面的子包中的代码, 添加了注解之后才能生效

2, 五大类注解

类注解(加在类上的注解)有五个:@Controller、@Service、@Repository、@Component、@Configuration

  • 使用 @Controller, 新建一个 UserController 类
    在这里插入图片描述

  • 使用 @Service, 新建一个 UserService 类
    在这里插入图片描述

  • 使用 @Repository, 新建一个 UserRepository 类
    在这里插入图片描述

  • 使用 @Component, 新建一个 UserComponent 类
    在这里插入图片描述

  • 使用 @Configuration, 新建一个 UserConfiguration 类
    在这里插入图片描述

  • 在启动类中使用 ApplicationContext 获取上下文对象, 使用 getBean 方法获取并使用刚刚存储的五个 Bean
    在这里插入图片描述

  • 观察执行结果, 是否都成功的存储了
    在这里插入图片描述


综上, 使用这五个类注解确实可以更方便的存储 Bean, 不需要再每存储一个就写一行配置标签, 那为什么要有五个呢? 一个不够吗? 这些注解有什么作用?

这五个注解分别标识了不同的作用, 看到这个注解就知道这个类是用来干什么的 :
@Controller 标识了业务逻辑层
@Service 标识了服务层
@Repository 标识了持久层
@Component 标识了组件层
@Configuration 标识了配置层

以下是阿里的工程分层调用流程 :

在这里插入图片描述

在真实的项目中也是需要按照大致的流程来分层管理代码模块


Bean 的命名规则

我们只是在配置文件中指定了要扫描的包路径, 并没有指定要存储的 Bean 的名称, 那凭什么根据下面代码中标出的这些命名就能正确找到 Bean 呢?

在这里插入图片描述

  • 默认情况下, Bean 的名称就是类名的小驼峰形式, 比如 : 类名是 UserController, Bean 的名称默认就是 userController

  • 但是!!! 如果类名的第一个字母和第二个字母都是大写, 比如: ABC, 那么 Bean 的名称就是 ABC(原类名) 而不是 aBC
    在这里插入图片描述
    如果 Bean 的名称是 aBC 无法存储
    在这里插入图片描述
    如果 Bean 的名称是 ABC 可以存储
    在这里插入图片描述

所以只有 不满足类名的前两个字母都是大写 的情况下, Bean 的默认命名是小驼峰形式, 否则就是原类名

当然也可以手动命名, 这些类注解都可以设置一个 Value 参数, 如图 :
在这里插入图片描述
在这里插入图片描述


3, 方法注解

方法注解 @Bean 是修饰在一个方法上, 那怎么能存储 Bean(类对象) 呢? 其实是把方法最终返回的对象存储起来, 且 @Bean 必须搭配五大类注解之一使用, 且一定要有返回值

  • 先定义一个 User 类
    -
  • 使用 @Bean 存储方法最终返回的 Bean 对象在这里插入图片描述
  • 获取并使用 Bean
    在这里插入图片描述

Bean 的命名规则

  • 使用方法注解存储的 Bean, 默认名称就是 @Bean 注解所加的方法名而不再是类名, (一个类中可能有多个方法需要使用 @Bean, 如果仍然使用类名作为默认命名, 可能多个 Bean 会重名)

  • 也可以给 @Bean 注解传递参数来设定名字, 甚至可以设置一个数组, 其中包含多个名字
    在这里插入图片描述
    获取 Bean 对象时使用这两个名字都可以
    在这里插入图片描述

  • 如果多个 @Bean 注解命名相同, 只有一个 Bean 能被存储
    在这里插入图片描述
    在这里插入图片描述

如果多个 @Bean 使用相同的名称, 例如上述 : 喜羊羊这个 Bean 先被加载, 所以先使用了 user 这个名字, 美羊羊这个 Bean 后被加载, 也想用 user 这个名字, 却被检查到 user 这个名字已经有人用了, 就不存储美羊羊这个 Bean 了

在 @Bean 中重命名之后, 就不能使用默认的命名了


二、获取 Bean

获取 Bean 对象也叫对象装配, 是把对象取出来放到某个类中,有时候也叫对象注⼊

对象注入有三种方式 : 属性注入, Setter 注入, 构造方法注入, 都是使用 @Autowired 注解来实现

按照实际开发的模式, 将 Repository 类注入到 Service 类中, Repository 类的实现如下:

在这里插入图片描述

当前代码以及接下来的代码都会放在dome4这个包下面, 配置文件中也要设置这个包的扫描路径


1, 属性注入

这是开发中最常用的方式, 因为代码简洁方便
在这里插入图片描述
加了 @Autowired 注解 之后, 就会将已经存储过的 UserRepository 这个类型的 Bean 注入进来

通过属性注入的方式, 就可以获取到这个 Bean 并使用它的方法


2, Setter 注入

在这里插入图片描述


3, 构造方法注入

构造方法注入是 Spring 推荐的方式
在这里插入图片描述

构造方法注入更符合单一设计的原则, 因为构造方法只会随着类的加载而调用一次, 不会被任意修改和调用, 也可以保证在使用这个被注入的对象时能被完全初始化, 也可以注入被 final 修饰的变量


4, @Autowired 和 @Resource 的区别

@Autowired 注解也可以被 @Resource 注解代替, 区别如下 :

  • 出身不同:@Autowired 来自于 Spring,而 @Resource 来自于 JDK 的注解;
  • 使⽤时设置的参数不同:相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如 name 设置,根据名称获取 Bean。
  • @Autowired 可用于 Setter 注入、构造函数注入和属性注入,而 @Resource ,不能⽤于构造函数注入

5, 同一个类型的多个 Bean 注入问题

  • 先定义一个 User 类, 提供 setter 和 toString 方法
    在这里插入图片描述
  • 在 Users 类中使用方法注解存储两个类型为 User 的 Bean, 并设置属性的值在这里插入图片描述
  • 在 Service 层注入 User, 查看 User 的值
    在这里插入图片描述
  • 在 APP 启动类中调用 showUser 这个方法, 观察结果
    在这里插入图片描述

程序执行的结果一定是报错, 因为我们存储了两个类型为 User 的 Bean , 在使用 @Autowired 注入时, 是首先根据 User 这个类型进行匹配, 发现找到了两个 Bean , 于是程序就不能确定到底要注入哪一个了
在这里插入图片描述

@Autowired 注入时, 首先根据类型进行匹配, 如果多个 Bean 类型相同, 再根据 Bean 的名称进行注入

  • 解决方案一 : 存储 Bean 时设置好名称, 注入时再明确指定名称
    在这里插入图片描述在这里插入图片描述
  • 解决方案二 : 使用 @Autowired 搭配 @Qualifier 注解指定注入的 Bean 的名称
    在这里插入图片描述

这个 @Qualifier 注解更像是加了一层筛选操作

  • 解决方案三 : 使用 @Resource 注解指定 name
    在这里插入图片描述
    在这里插入图片描述

使用上述任意三种方式都可以正确的拿到想要的 Bean :
在这里插入图片描述


总结

以上就是本篇的所有内容了:

  • 使用 @Controller、@Service、@Repository、@Component、@Configuration 这五大类注解可以存储 Bean, 在注解中设置一个 Value 参数对 Bean 重命名
  • 使用 @Bean 这个方法注解并搭配任意一个类注解可以将返回值作为 Bean 存储, 在注解中可以指定一个或多个字符串对 Bean 重命名
  • 使用 @Autowired 可以进行属性注入, setter 注入, 构造方法注入, 实现方便的获取 Bean

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

「2024」预备研究生mem-论证推理强化:评价类

一、论证推理强化&#xff1a;评价类 二、课后题

解决: git拉取报错 git 未能顺利结束 (退出码 1)

拉取代码失败信息 解决方法: 执行一下"git push -f origin master"命令即可 步骤: 1.项目文件夹右击选择"Git Bash Here",打开命令窗口 2. 输入"git push -f origin master"后,回画 执行结束 3.再拉取代码,成功

【数学建模】-- Matlab中图的最短路径

前言&#xff1a; 图的基本概念&#xff1a; 若想简单绘制图可以利用此网站&#xff1a; 左上角Undirected/Directed是无向图/有向图 左边 0-index &#xff0c;1-index为0下标&#xff0c;1下标。 Node Count为节点个数 Graph Data&#xff1a;最初尾节点的名称&#xff…

从初学者的角度来理解指针常量和常量指针

重新理解指针常量&#xff0c;常量指针 应用 我先提一个问题&#xff1a;知道指针常量&#xff0c;常量指针存在的作用是什么吗&#xff1f; 先了解它们存在的作用再去理解它们&#xff0c;或许更轻松些。 比如配置文件读取&#xff1a;在许多工程中&#xff0c;配置文件用于…

linux 下 网卡命名改名

Linux 操作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等&#xff0c;而 CentOS7 提供了不同的命名规则&#xff0c;默认是网卡命名会根据网卡的硬件信息&#xff0c;插槽位置等有关&#xff1b;来分配。这样做的优点是命名全自动的、可预知的&#xff0c;缺点是比 eth0、…

计算机服务器被360后缀勒索病毒攻击怎么办,勒索病毒解密

计算机技术的不断发展&#xff0c;不仅方便了企业的生产生活&#xff0c;也为社会的发展带来了巨大贡献&#xff0c;但随之而来的网络威胁也不断增加&#xff0c;勒索病毒就是其中较为常见的常见的威胁。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的计算机服务器…

volatile,解决内存可见性引起的问题,wait和notify

补充&#xff1a;synchronized&#xff08;务必会读&#xff08;辛可肉耐子&#xff09;会写&#xff09;&#xff0c;要搭配一个对象的时候&#xff0c;不一定非要是访问的this成员 synchronized(锁对象&#xff09;{ 代码块} public synchronized static void func(){} 静态方…

JS+CSS实现内凹导航栏

在移动互联网时代&#xff0c;导航栏是一个非常重要的元素&#xff0c;它能够帮助用户快速找到所需的信息。下面使用JS CSS实现一个内凹导航栏&#xff0c;内凹导航栏则是一种比较流行的设计风格&#xff0c;它能够让导航栏看起来更加立体和美观&#xff0c;视觉效果也非常不错…

vue : 无法加载文件 C:\Users\…\npm\vue.ps1,因为在此系统上禁止运行脚本。

在 PowerShell 中创建 vue 项目时&#xff0c;出现了以下错误导致创建失败&#xff1a;vue : 无法加载文件 C:\Users\…\npm\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。 报错原因 用户权限不足导致无法加载文件&#xff0c;以管理员身份运行终端或者 PowerShell 也可…

使用Three.js制作一个旋转多面体

之前一直对three.js比较好奇&#xff0c;但是一直没有着手学习。今天刷到一篇博客&#xff08;博主&#xff1a;1_bit&#xff09;&#xff0c;觉得挺有意思&#xff0c;就跟着敲了一下。 html: 其中canvas用于添加渲染好的元素&#xff0c;本篇文章通过CDN形式引入three.js,…

2023 Gartner RPA魔力象限报告解读:国产厂商“破纪录”跃升意味着什么?

2023 Gartner RPA魔力象限报告解读&#xff1a;象限跃升彰显国产RPA厂商实力 2023 Gartner RPA魔力象限报告四大行业趋势&#xff0c;国产RPA厂商已在践行 文/王吉伟 8月3日&#xff0c;全球著名咨询调查机构Gartner发布了《2023年全球RPA魔力象限&#xff08;Gartner RPA M…

ceph相关概念和部署

Ceph 可用于向云提供 Ceph 对象存储 平台和 Ceph 可用于提供 Ceph 块设备服务 到云平台。Ceph 可用于部署 Ceph 文件 系统。所有 Ceph 存储集群部署都从设置 每个 Ceph 节点&#xff0c;然后设置网络。 Ceph 存储集群需要满足以下条件&#xff1a;至少一个 Ceph 监控器&#x…

10分钟学会阿里OSS对象存储

一. 前言 最近有很多小伙伴问&#xff0c;如果我们要进行大规模的文件存储该怎么做? 其实实现文件存储的技术有很多&#xff0c;如果我们在网上搜索一下&#xff0c;你会发现实现的技术简直是五花八门&#xff0c;比如有一种技术叫FastDFS就可以实现文件存储&#xff0c;但该…

Effective Java笔记(31)利用有限制通配符来提升 API 的灵活性

参数化类型是不变的&#xff08; invariant &#xff09; 。 换句话说&#xff0c;对于任何两个截然不同的类型 Typel 和 Type2 而言&#xff0c; List<Type1 &#xff1e;既不是 List<Type 2 &#xff1e; 的子类型&#xff0c;也不是它的超类型 。虽然 L ist<String…

问道管理:零基础学炒股?

跟着股市的不断升温&#xff0c;越来越多的人参加到了炒股大军中&#xff0c;希望经过股市赚到更多的金钱。但是关于零根底的新手来说&#xff0c;怎么开始学习炒股成为了一个难题。那么&#xff0c;零根底学炒股真的难吗&#xff1f;怎么更好的入门和学习&#xff1f; 首要&am…

线性代数(三) 线性方程组

前言 如何利用行列式&#xff0c;矩阵求解线性方程组。 线性方程组的相关概念 用矩阵方程表示 齐次线性方程组&#xff1a;Ax0&#xff1b;非齐次线性方程组&#xff1a;Axb. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的…

模型、策略和算法

模型(model)、策略(strategy)和算法(algorithm)是统计学习的所有内容. 模型是统计学习的最终结果&#xff0c;即决策函数(decision function) 或条件概率函数 &#xff0c;它被⽤来预测特定问题下&#xff0c;将来未知输⼊的输出结果. 策略是统计学习过程中的产⽣最优模型的评…

如何使用vue创建一个项目

1、安装node.js 打开cmd 输入node -v 和npm -v查看电脑是否已经安装了node,js 如果出现以下截图&#xff0c;则说明已经有node.js&#xff0c;可忽略此步 如果没有&#xff0c;则打开官网&#xff0c;下载即可 下载地址&#xff1a;Node.js 下载完成后&#xff0c;打开cmd输…

漏洞挖掘日记1:企业src某系统存在登录绕过漏洞

&#xff08;一&#xff09;漏洞描述 这个漏洞属于逻辑漏洞&#xff0c;逻辑漏洞是指开发者在开发过程中&#xff0c;实现业务上出现了逻辑上的漏洞。之所以出现逻辑漏洞&#xff0c;是因为一些开发者&#xff0c;在开发过程中&#xff0c;第一考虑是怎么实现功能&#xff0c;…

OPENCV C++(十)gramm矫正+直方图均衡化

两者都是只对单通道使用&#xff0c;对多通道的话 就需要分离通道处理再合并通道 两种方法&#xff0c;第一个要运算次数太多了&#xff0c;第二个只需要查表 伽马矫正函数&#xff0c;这里用第二种方法&#xff0c;且写法有点高级 int gammaCorrection(cv::Mat srcMat, cv::…