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

您所在的位置:网站首页 获取bean的方法 【Spring】使用类注解或方法注解, 更简单的存储和获取 Bean

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

2024-07-11 17:06| 来源: 网络整理| 查看: 265

文章目录 前言一、存储 Bean1, 配置文件2, 五大类注解Bean 的命名规则 3, 方法注解Bean 的命名规则 二、获取 Bean1, 属性注入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, 配置文件 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

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

上山总比下山辛苦 下篇文章见在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3