@Bean注解详细介绍以及应用
目录
- 一、概念
- 二、应用
- (一)代码示例
- 1、首先创建一个简单的 Java 类User
- 2、然后创建一个配置类AppConfig
- 3、在其他组件中使用@Bean创建的 bean
- 4、通过 Spring 的ApplicationContext来获取UserService并调用其方法
- (二)bean的方法名详解
- 1、方法名可以修改
- 2、bean 名称的默认规则变化
- 2.1 @Autowired和@Resource按名称注入的情况
- 2.2、@Autowired按类型注入的情况
- 3、指定 bean 名称
一、概念
- @Bean是 Spring 框架中的一个注解,它用于告诉 Spring 容器,一个方法将会返回一个对象,这个对象应该被注册为 Spring应用上下文中的一个 bean。通常在@Configuration注解的类中使用,不过也可以在@Component等其他可以被 Spring容器扫描到的组件类中使用。
- 作用主要包括: 定义和配置 Spring 容器管理的对象。这些对象可以是任何 Java对象,例如数据访问对象(DAO)、服务层对象(Service)、控制器对象(Controller)等。允许自定义对象的创建和初始化过程,包括设置对象的属性、调用构造方法等。
二、应用
(一)代码示例
1、首先创建一个简单的 Java 类User
public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
2、然后创建一个配置类AppConfig
在这个配置类中使用@Bean注解来创建User对象
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic User user() {return new User("John", 30);}
}
在上述代码中:
- @Configuration注解表示这个类是一个配置类,它的作用类似于传统 Spring XML 配置文件中的标签。
- @Bean注解标注在user方法上。这个方法返回一个User对象,Spring 容器会将这个返回的User对象注册为一个 bean。这个bean 的名称默认是方法名,即user。如果想指定一个不同的名称,可以在@Bean注解中使用name属性,例如@Bean(name =“customUser”)。
3、在其他组件中使用@Bean创建的 bean
可以在其他 Spring 组件(如@Service、@Controller等注解的类)中注入由@Bean创建的User对象。例如,创建一个简单的服务类UserService
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {private User user;@Autowiredpublic UserService(User user) {this.user = user;}public void printUserInfo() {System.out.println("User name: " + user.getName() + ", Age: " + user.getAge());}
}
4、通过 Spring 的ApplicationContext来获取UserService并调用其方法
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);UserService userService = context.getBean(UserService.class);userService.printUserInfo();}
}
- 在这个示例中,UserService通过构造函数注入了User对象。当Main类的main方法运行时,AnnotationConfigApplicationContext会根据AppConfig配置类来创建
Spring 容器,容器会创建User和UserService这两个
bean,并将User注入到UserService中。最后调用UserService的printUserInfo方法会输出User对象的信息。
@Bean注解是 Spring 框架中非常重要的一种配置方式,它提供了一种灵活的、基于 Java 代码的方式来定义和管理 Spring 应用中的对象。
(二)bean的方法名详解
1、方法名可以修改
在@Bean注解的方法中,方法名是可以修改的。例如,你可以将user()方法修改为createUser()方法
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic User createUser() {return new User("John", 30);}
}
2、bean 名称的默认规则变化
-
当方法名改变后,默认情况下,Spring 容器中这个 bean 的名称也会随之改变。现在这个 bean 的默认名称是createUser。
-
这意味着在其他组件中通过@Autowired或@Resource进行依赖注入时,如果是按照名称注入,注入的名称也要相应地修改。例如,在UserService类中,如果之前是通过@Autowired按照名称注入user这个 bean,现在就需要修改为注入createUser这个 bean(假设是按照名称注入)。
-
不过如果是通过类型注入(@Autowired默认的注入方式,当只有一个匹配类型的 bean 时),则不需要修改注入的代码。
2.1 @Autowired和@Resource按名称注入的情况
- @Autowired按名称注入(结合@Qualifier使用): 通常情况下,@Autowired是按照类型进行依赖注入的,Spring会查找匹配类型的 bean 并注入到相应的位置。但当存在多个相同类型的 bean时,可以结合@Qualifier注解来指定按照名称注入具体的 bean。
例如,假设我们有两个不同的User类型的 bean 配置方法,一个原来的user()方法(返回User对象且 bean 名称默认就是user),另一个是新修改方法名后的createUser()方法(bean 名称默认变成了createUser),并且在UserService类中是通过@Autowired结合@Qualifier按名称注入User对象的情况,代码可能如下
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;@Service
public class UserService {private User user;@Autowired@Qualifier("user") // 这里指定按名称注入名为user的beanpublic UserService(User user) {this.user = user;}public void printUserInfo() {System.out.println("User name: " + user.getName() + ", Age: " + user.getAge());}
}
- 当把配置类中返回User对象的方法名从user()改成createUser()后,默认 bean
名称变了,那上面@Qualifier(“user”)这里指定的名称就和实际 Spring 容器中生成的 bean
名称不匹配了(现在默认是createUser),就需要把@Qualifier里的名称修改为createUser,这样才能正确注入想要的那个User对象
bean。 - @Resource按名称注入:
@Resource注解默认就是按照名称进行依赖注入的。比如还是上面的场景,在UserService类中通过@Resource注入User对象,代码像这样
import javax.annotation.Resource;
import org.springframework.stereotype.Service;@Service
public class UserService {private User user;@Resource(name = "user") // 按名称注入名为user的beanpublic void setUser(User user) {this.user = user;}public void printUserInfo() {System.out.println("User name: " + user.getName() + ", Age: " + user.getAge());}
}
- 同样,当配置类中返回User对象的方法名改变导致 bean
名称改变后,这里@Resource注解中指定的名称(user)就不对了,得改成新的 bean
名称(比如createUser),才能正确地从 Spring 容器中找到并注入对应的User对象 bean
2.2、@Autowired按类型注入的情况
- @Autowired注解在大多数场景下,当容器中只有一个匹配类型的 bean 时,会自动按照类型进行注入,并不需要明确指定名称。
例如,之前配置类中有user()方法返回User对象,在UserService类中通过@Autowired注入(像这样)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {private User user;@Autowiredpublic UserService(User user) {this.user = user;}public void printUserInfo() {System.out.println("User name: " + user.getName() + ", Age: " + user.getAge());}
}
- 就算之后把配置类中返回User对象的方法名从user()改成了createUser(),只要 Spring 容器里User类型的 bean
仍然只有这一个(不管它名称是跟着方法名变了还是通过@Bean注解的name属性指定了别的名称),Spring
依旧能通过类型找到这个唯一的User对象
bean,并正确地注入到UserService类中对应的User属性位置,所以在UserService类中关于@Autowired注入的代码就不需要做任何修改。
总的来说,就是不同的依赖注入方式在面对@Bean方法名改变导致 bean 名称变化时,按名称注入需要相应调整注入时指定的名称,而按类型注入(在符合单类型 bean 条件下)不受方法名改变带来的 bean 名称变化影响。
3、指定 bean 名称
如果你不想让 bean 的名称随着方法名的改变而改变,或者想给 bean 一个自定义的名称,你可以在@Bean注解中使用name属性。例如
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Bean(name = "user")public User createUser() {return new User("John", 30);}
}
在这种情况下,即使方法名是createUser,但在 Spring 容器中这个 bean 的名称仍然是user,这样在其他组件进行注入时,就可以继续使用user这个名称来引用这个 bean。
相关文章:
@Bean注解详细介绍以及应用
目录 一、概念二、应用(一)代码示例1、首先创建一个简单的 Java 类User2、然后创建一个配置类AppConfig3、在其他组件中使用Bean创建的 bean4、通过 Spring 的ApplicationContext来获取UserService并调用其方法 (二)bean的方法名详…...
基于SpringBoot的预制菜销售系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
从 EXCEL 小白到 EXCEL 高手的成长之路
在职场与日常生活中,Excel 作为一款强大的数据处理与分析工具,扮演着不可或缺的角色。无论是初学者还是资深职场人士,掌握 Excel 技能都能极大地提高工作效率。那么,从一个 Excel 小白蜕变成为 Excel 高手,究竟需要多久…...
【纸飞机串口调试工具】数值显示器及四则运算
目录 纸飞机串口工具介绍软件下载适用场合功能介绍 纸飞机串口工具介绍 纸飞机一款性能强劲且专业的串口/网络/HID调试助手,具有多窗口绘图、关键字高亮、数据分窗和数据过滤等众多功能,可以极大的方便嵌入式开发人员的调试过程。本文介绍数值显示器的四…...
浅谈volatile
volatile有三个特性: (1)可见性 (2)不保证原子性 (3)禁止指令重排 下面我们一一介绍 (一)可见性 volatile的可见性是说共享变量只要修改,就可以被其他线…...
Python3 爬虫 Scrapy的使用
安装完成Scrapy以后,可以使用Scrapy自带的命令来创建一个工程模板。 一、创建项目 使用Scrapy创建工程的命令为: scrapy startproject <工程名> 例如,创建一个抓取百度的Scrapy项目,可以将命令写为: scrapy s…...
多线程篇-4--重点概念1(volatile,Synchronized,内存屏障,MESI协议)
一、volatile (1)、简述 volatile是java提供的一个关键字,英文意思为不稳定的。 可以保障被声明对象的可见性和一定程度上的有序性,但不能保证操作的原子性。 当一个变量被声明为volatile时,意味着该变量的值会直接从…...
本地学习axios源码-如何在本地打印axios里面的信息
1. 下载axios到本地 git clone https://github.com/axios/axios.git 2. 下载react项目, 用vite按照提示命令配置一下vite react ts项目 npm create vite my-vue-app --template react 3. 下载koa, 搭建一个axios请求地址的服务端 a.初始化package.json mkdir koa-server…...
1、SpringBoo中Mybatis多数据源动态切换
我们以一个实例来详细说明一下如何在SpringBoot中动态切换MyBatis的数据源。 一、需求 1、用户可以界面新增数据源相关信息,提交后,保存到数据库 2、保存后的数据源需要动态生效,并且可以由用户动态切换选择使用哪个数据源 3、数据库保存了多个数据源的相关记录后,要求…...
【浏览器】缓存与存储
我是目录 浏览器缓存为什么需要浏览器缓存?对浏览器的缓存机制的理解协商缓存和强缓存的区别强缓存协商缓存 点击刷新按钮或者按 F5、按 CtrlF5 (强制刷新)、地址栏回车有什么区别? 浏览器本地存储前端储存的方式有哪些࿱…...
积鼎科技携手西北工业大学动力与能源学院共建复杂多相流仿真联合实验室
11月26日,复杂多相流仿真联合实验室揭牌仪式及技术研讨活动在西北工业大学动力与能源学院成功举办。复杂多相流仿真联合实验室是由西北工业大学动力与能源学院牵头,携手上海积鼎信息科技有限公司与三航铸剑(西安)科技发展有限公司…...
5. langgraph实现高级RAG (Adaptive RAG)
1. 数据准备 from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.document_loaders import WebBaseLoader from langchain_community.vectorstores import Chromaurls ["https://lilianweng.github.io/posts/2023-06-23-age…...
Postman设置接口关联,实现参数化
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…...
代码随想录day02--链表
移除链表元素 题目 地址:https://leetcode.cn/problems/remove-linked-list-elements/description/ 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 思路是使用虚拟节点的…...
杰发科技AC7803——不同晶振频率时钟的配置
计算公式 PLL_POSDIV [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62] PLL_PREDIV_1 1 2 4 USE_XTAL 24M SYSCLK_FREQ 64M SYSCLK_DIVIDER 1 VCO USE_XTAL*…...
ArcGIS栅格影像裁剪工具
1、前言 在最近的栅格转矢量处理过程中,发现二值化栅格规模太大,3601*3601,并且其中的面元太过细碎,通过arcgis直接栅格转面有将近几十万的要素,拿这样的栅格数据直接运行代码,发现速度很慢还难以执行出来结…...
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
docker快速安装zookeeper
一、拉取镜像 docker pull zookeeper:3.9.3 二、启动zookeeper docker run --restartalways -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime zookeeper:3.9.3 如果需要挂载zookeeper文件及目录,则参数增加: -v /mydata/zookeeper/d…...
MySQL中如何减少回表
在MySQL中,回表是指在使用非聚集索引进行查询时,如果需要获取的数据不在索引页中,就需要根据索引页中的指针返回到数据表中查找实际数据行的过程。这个过程会增加额外的磁盘I/O操作,降低查询性能,特别是在查询大量数据…...
初始Python篇(7)—— 正则表达式
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
