Spring Boot 中 @Bean 注解详解:从入门到实践

在 Spring Boot 开发中,@Bean注解是一个非常重要且常用的注解,它能够帮助开发者轻松地将 Java 对象纳入 Spring 容器的管理之下,实现对象的依赖注入和生命周期管理。对于新手来说,理解并掌握@Bean注解,是深入学习 Spring Boot 开发的必经之路。

接下来,我们就来详细了解一下这个注解。

一、@Bean 注解的基本概念​

@Bean注解是 Spring 框架提供的用于定义 Bean 的方式之一,它可以用在方法上,告诉 Spring 容器,这个方法返回的对象应该被注册为一个 Bean,纳入 Spring 容器的管理。

简单来说,通过@Bean注解标记的方法,就像是一个 “工厂方法”,负责创建并返回特定的 Java 对象实例,然后 Spring 容器会对这些实例进行管理,比如控制它们的创建时机、生命周期等。​

二、@Bean 注解的使用场景​

1.在配置类中定义 Bean​

在 Spring Boot 中,我们通常会创建一个配置类,使用@Configuration注解标记,在这个配置类中可以定义多个@Bean方法。下面通过一个简单的示例来演示:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {// 定义一个名为myService的Bean@Beanpublic MyService myService() {return new MyService();}
}class MyService {public void doSomething() {System.out.println("MyService is doing something.");}
}

在上述代码中,AppConfig是一个配置类,通过@Configuration注解声明。在该类中,myService方法使用@Bean注解标记,它返回一个MyService的实例。这样,Spring 容器在启动时,就会调用这个方法创建MyService实例,并将其注册为一个 Bean,其他需要使用MyService的组件就可以通过依赖注入的方式获取这个实例。​

2.传递方法参数​

@Bean方法也可以接收参数,Spring 容器会自动将容器中匹配的 Bean 作为参数传入。例如:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {// 这里简单模拟创建数据源return new DataSource();}@Beanpublic MyRepository myRepository(DataSource dataSource) {return new MyRepository(dataSource);}
}class DataSource {// 数据源相关代码
}class MyRepository {private DataSource dataSource;public MyRepository(DataSource dataSource) {this.dataSource = dataSource;}// 数据访问相关代码
}

在这个例子中,myRepository方法依赖于dataSource Bean。Spring 容器在创建myRepository Bean 时,会自动查找容器中类型为DataSource的 Bean,并将其作为参数传入myRepository方法,从而实现了 Bean 之间的依赖关系。​

3.设置 Bean 的作用域​

通过@Bean注解还可以设置 Bean 的作用域,默认情况下,Bean 的作用域是单例(Singleton),即整个应用程序中只有一个实例。但我们也可以通过@Scope注解来改变 Bean 的作用域。例如,将 Bean 的作用域设置为原型(Prototype),每次请求都会创建一个新的实例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;@Configuration
public class AppConfig {@Bean@Scope("prototype")public MyService myService() {return new MyService();}
}

在上述代码中,@Scope("prototype")注解将myService Bean 的作用域设置为原型,这样每次从 Spring 容器中获取myService实例时,都会得到一个新创建的对象。​

三、@Bean 注解与其他相关注解的关系​

1.@Bean 与 @Component 系列注解的区别​

@Component、@Service、@Repository、@Controller等注解也是用于将类纳入 Spring 容器管理的,但它们是用在类上,通过类路径扫描的方式自动发现并注册 Bean。

而@Bean注解是用在方法上,需要显式地在配置类中定义 Bean。​

例如,对于一个服务类,可以使用@Service注解:

import org.springframework.stereotype.Service;@Service
public class MyService {public void doSomething() {System.out.println("MyService is doing something.");}
}

Spring 容器会自动扫描到带有@Service注解的类,并将其实例注册为 Bean。而使用@Bean则需要在配置类中定义方法来创建实例。​

2.@Bean 与 @Autowired 的配合使用​

@Autowired注解用于实现 Bean 的依赖注入,它可以将 Spring 容器中管理的 Bean 自动注入到需要使用的地方。通常情况下,@Bean注解创建的 Bean 和@Autowired注解配合使用,来实现组件之间的依赖关系。​

例如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyComponent {private MyService myService;@Autowiredpublic MyComponent(MyService myService) {this.myService = myService;}public void doWork() {myService.doSomething();}
}

在上述代码中,MyComponent类通过构造函数注入的方式,将MyService Bean 注入进来。MyService Bean 就是通过@Bean注解在配置类中定义的。​

四、总结​

@Bean注解是 Spring Boot 中定义 Bean 的重要方式,它具有高度的灵活性和扩展性。

通过@Bean注解,我们可以在配置类中显式地创建 Bean 实例,控制 Bean 之间的依赖关系,设置 Bean 的作用域等。

同时,它与@Component系列注解、@Autowired注解等相互配合,共同构建了 Spring 强大的依赖注入和 Bean 管理体系。作为新手,熟练掌握@Bean注解的使用,对于开发高效、可维护的 Spring Boot 应用程序至关重要。在实际开发过程中,我们可以根据具体的业务需求,灵活运用@Bean注解,充分发挥 Spring 框架的优势。​

上述内容从多方面介绍了@Bean注解。若你对文中代码示例、某些概念还有疑问,或想了解更多相关知识,欢迎随时告诉我。

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

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

相关文章

TCP 协议设计入门:自定义消息格式与粘包解决方案

目录 一、为什么需要自定义 TCP 协议? TCP粘包问题的本质 1.1 粘包与拆包的定义 1.2 粘包的根本原因 1.3 粘包的典型场景 二、自定义消息格式设计 2.1 协议结构设计 方案1:固定长度协议 方案2:分隔符标记法 方案3:长度前…

了解一下OceanBase中的表分区

OceanBase 是一个高性能的分布式关系型数据库,它支持 SQL 标准的大部分功能,包括分区表。分区表可以帮助管理大量数据,提高查询效率,通过将数据分散到不同的物理段中,可以减少查询时的数据扫描量。 在 OceanBase 中操…

多线程网络编程:粘包问题、多线程/多进程服务器实战与常见问题解析

多线程网络编程:粘包问题、多线程/多进程服务器实战与常见问题解析 一、TCP粘包问题:成因、影响与解决方案 1. 粘包问题本质 TCP是面向流的协议,数据传输时没有明确的消息边界,导致多个消息可能被合并(粘包&#xf…

大模型主干

1.什么是语言模型骨架LLM-Backbone,在多模态模型中的作用? 语言模型骨架(LLM Backbone)是多模态模型中的核心组件之一。它利用预训练的语言模型(如Flan-T5、ChatGLM、UL2等)来处理各种模态的特征,进行语义…

[创业之路-350]:光刻机、激光器、自动驾驶、具身智能:跨学科技术体系全景解析(光-机-电-材-热-信-控-软-网-算-智)

光刻机、激光器、自动驾驶、具身智能四大领域的技术突破均依赖光、机、电、材、热、信、控、软、网、算、智十一大学科体系的深度耦合。以下从技术原理、跨学科融合、关键挑战三个维度展开系统性分析: 一、光刻机:精密制造的极限挑战 1. 核心技术与学科…

SVTAV1 编码函数 svt_aom_is_pic_skipped

一 函数解释 1.1 svt_aom_is_pic_skipped函数的作用是判断当前图片是否可以跳过编码处理。 具体分析如下 函数逻辑 参数说明:函数接收一个指向图片父控制集的指针PictureParentControlSet *pcs, 通过这个指针可以获取与图片相关的各种信息,用于判断是否跳…

【Redis新手入门指南】从小白入门到日常使用(全)

文章目录 前言redis是什么?定义原理与特点与MySQL对比 Redis安装方式一、Homebrew 快速安装 Redis(推荐)方式二、源码编译安装redisHomebrew vs 源码安装对比 redis配置说明修改redis配置的方法常见redis配置项说明 redis常用命令redis服务启…

Linux grep 命令详解及示例大全

文章目录 一、基本语法二、常用选项及示例1. 基本匹配:查找包含某字符串的行2. 忽略大小写匹配 -i3. 显示行号 -n4. 递归查找目录下的文件 -r 或 -R5. 仅显示匹配的字符串 -o6. 使用正则表达式 -E(扩展)或 egrep7. 显示匹配前后行 -A, -B, -C…

【排序算法】快速排序(全坤式超详解)———有这一篇就够啦

【排序算法】——快速排序 目录 一:快速排序——思想 二:快速排序——分析 三:快速排序——动态演示图 四:快速排序——单趟排序 4.1:霍尔法 4.2:挖坑法 4.3:前后指针法 五:…

【platform push 提示 Invalid source ref: HEAD】

platform push 提示 Invalid source ref: HEAD 场景:环境:排查过程:解决: 场景: 使用platform push 命令行输入git -v 可以输出git 版本号,但就是提示Invalid source ref: HEAD,platform creat…

x-cmd install | Tuistash - Logstash 实时监控,告别图形界面,高效便捷!

目录 核心优势,一览无遗安装适用场景,广泛覆盖功能亮点,不容错过 还在为 Logstash 的监控而头疼吗?还在频繁切换图形界面查看数据吗?现在,有了 Tuistash,一切都将变得简单高效! Tui…

【JEECG】BasicTable单元格编辑,插槽添加下拉组件样式错位

1.功能说明 BasicTable表格利用插槽&#xff0c;添加组件实现单元格编辑功能&#xff0c;选择组件下拉框错位 2.效果展示 3.解决方案 插槽内组件增加&#xff1a;:getPopupContainer"getPopupContainer" <template #salesOrderProductStatus"{ column, re…

论文阅读笔记——ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors

RoboGround 论文 一类中间表征是语言指令&#xff0c;但对于空间位置描述过于模糊&#xff08;“把杯子放桌上”但不知道放桌上哪里&#xff09;&#xff1b;另一类是目标图像或点流&#xff0c;但是开销大&#xff1b;由此 GeoDEX 提出一种兼具二者的掩码。 相比于 GR-1&#…

K8S的使用(部署pod\service)+安装kubesphere图形化界面使用和操作

master节点中通过命令部署一个tomcat 查看tomcat被部署到哪个节点上 在节点3中进行查看 在节点3中进行停止容器&#xff0c;K8S会重新拉起一个服务 如果直接停用节点3&#xff08;模拟服务器宕机&#xff09;&#xff0c;则K8S会重新在节点2中拉起一个服务 暴露tomcat访…

纷析云开源财务软件:重新定义企业财务自主权

痛点直击&#xff1a;传统财务管理的三大桎梏 “黑盒”困局 闭源商业软件代码不可见&#xff0c;企业无法自主调整功能&#xff0c;政策变化或业务升级依赖厂商排期&#xff0c;响应滞后。 数据托管于第三方平台&#xff0c;存在泄露风险&#xff0c;合规审计被动受限。 成本…

mybatis 的多表查询

文章目录 多表查询一对一一对多 多表查询 一对一 开启代码片段编写 专注于 SQL的 编写 JDBC 的写法&#xff0c;注重于 SQL mybatis 在 一对一查询时&#xff0c;核心在于 建立每个表对应的实体类主键根据 主键 id 进行查询&#xff0c;副标根据 设定外键进行查询 在 SQL编写…

Scrapy爬虫实战:如何用Rules实现高效数据采集

Scrapy是一个强大的Python爬虫框架&#xff0c;而其中的Rules类则为爬虫提供了更高级的控制方式。本文将详细介绍如何在Scrapy中使用Rules&#xff0c;以及各个参数的具体作用&#xff0c;并结合实际场景说明Rules的必要性。 为什么需要Rules&#xff1f; 在Web爬取过程中&…

ActiveMQ 性能优化与网络配置实战(一)

一、引言 在当今分布式系统和微服务架构盛行的时代&#xff0c;消息中间件作为实现系统间异步通信、解耦和削峰填谷的关键组件&#xff0c;其重要性不言而喻。ActiveMQ 作为一款广泛应用的开源消息中间件&#xff0c;凭借其对多种消息协议的支持、灵活的部署方式以及丰富的功能…

免费视频压缩软件

一、本地软件&#xff08;支持离线使用&#xff09; 1. HandBrake 平台&#xff1a;Windows / macOS / Linux 特点&#xff1a;开源免费&#xff0c;支持多种格式转换&#xff0c;提供丰富的预设选项&#xff08;如“Fast 1080p”快速压缩&#xff09;&#xff0c;可自定义分…

消除AttributeError: module ‘ttsfrd‘ has no attribute ‘TtsFrontendEngine‘报错输出的记录

#工作记录 尝试消除 消除“模块ttsfrd没有属性ttsfrontendengine”的错误的记录 报错摘录&#xff1a; Traceback (most recent call last): File "F:\PythonProjects\CosyVoice\webui.py", line 188, in <module> cosyvoice CosyVoice(args.model_di…