@Bean详解


上文我们简单的通过注解类+@bean注解的方式将第三方类注入到了IOC容器进行管理,那么本文我们来详细介绍@bean的用法。

1. @Bean生成Bean的Name问题

@Bean注解源码:

public @interface Bean {//前两个注解可以指定Bean的标识@AliasFor("name")String[] value() default {};@AliasFor("value")String[] name() default {};//autowireCandidate 属性来指示该 Bean 是否候选用于自动装配。//autowireCandidate 属性默认值为 true,表示该 Bean 是一个默认的装配目标,//可被候选用于自动装配。如果将 autowireCandidate 属性设置为 false,则说明该 Bean 不是默认的装配目标,不会被候选用于自动装配。boolean autowireCandidate() default true;//指定初始化方法String initMethod() default "";//指定销毁方法String destroyMethod() default "(inferred)";
}

通过源码可以看到,我们可以通过name或者value来为组件进行赋值。

指定@Bean的名称:

@Configuration
public class AppConfig {@Bean("myThing") //指定名称public Thing thing() {return new Thing();}
}

@Bean 注释注释方法。使用此方法在指定为方法返回值的类型的 ApplicationContext 中注册 Bean 定义。缺省情况下,Bean 名称与方法名称相同。下面的示例演示 @Bean 方法声明:

@Configuration
public class AppConfig {@Beanpublic TransferServiceImpl transferService() {return new TransferServiceImpl();}
}

前面的配置完全等同于下面的Spring XML:

<beans><bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

2. @Bean 初始化和销毁方法指定

@Bean 注解支持指定任意初始化和销毁回调方法,非常类似于 Spring XML 在 bean 元素上的 init-methoddestroy-method 属性,如以下示例所示:

public class BeanOne {public void init() {// initialization logic}
}public class BeanTwo {public void cleanup() {// destruction logic}
}@Configuration
public class AppConfig {@Bean(initMethod = "init")public BeanOne beanOne() {return new BeanOne();}@Bean(destroyMethod = "cleanup")public BeanTwo beanTwo() {return new BeanTwo();}
}

3. @Bean Scope作用域

可以指定使用 @Bean 注释定义的 bean 应具有特定范围。您可以使用在 Bean 作用域部分中指定的任何标准作用域。singleton表示单例模式,prototype表示多例。

默认作用域为 singleton ,但您可以使用 @Scope 注释覆盖此范围,如以下示例所示:

@Configuration
public class MyConfiguration {@Bean@Scope("prototype")public Encryptor encryptor() {// ...}
}

4. @Bean方法之间依赖

4.1 场景说明

在实际应用场景中,我们可能需要在一个@bean方法中用到另一个bean组件,这样,bean方法之间就存在依赖关系。那么,如何处理这种依赖关系?

例如,当前有以下两个组件:

public class HappyMachine {private String machineName;public String getMachineName() {return machineName;}public void setMachineName(String machineName) {this.machineName = machineName;}
}
public class HappyComponent {//引用新组件private HappyMachine happyMachine;public HappyMachine getHappyMachine() {return happyMachine;}public void setHappyMachine(HappyMachine happyMachine) {this.happyMachine = happyMachine;}public void doWork() {System.out.println("HappyComponent.doWork");}}

可以看到,HappyComponent 中包含HappyMachine 类型的属性,两者存在依赖关系。

4.2 方法一

直接调用方法返回 Bean 实例:在一个 @Bean 方法中直接调用其他 @Bean 方法来获取 Bean 实例,虽然是方法调用,也是通过IoC容器获取对应的Bean,例如:

@Configuration
public class JavaConfig {@Beanpublic HappyMachine happyMachine(){return new HappyMachine();}@Beanpublic HappyComponent happyComponent(){HappyComponent happyComponent = new HappyComponent();//直接调用方法即可! happyComponent.setHappyMachine(happyMachine());return happyComponent;}}

可以看到,先使用@Bean将happyMachine注入IOC容器,之后在happyComponent的bean方法中,可以调用happyMachine的bean方法即可。

4.3 方法二

参数引用法:通过方法参数传递 Bean 实例的引用来解决 Bean 实例之间的依赖关系,例如:


import com.atguigu.ioc.HappyComponent;
import com.atguigu.ioc.HappyMachine;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class JavaConfig {@Beanpublic HappyMachine happyMachine(){return new HappyMachine();}@Beanpublic HappyComponent happyComponent(HappyMachine happyMachine){HappyComponent happyComponent = new HappyComponent();//赋值happyComponent.setHappyMachine(happyMachine);return happyComponent;}}

注意:

可以直接在形参列表接收IoC容器中的Bean!

  • 情况1: 如果只有一个bean,直接指定类型即可

  • 情况2: 如果有多个bean,(HappyMachine 名称 ) 形参名称等于要指定的bean名称。

    例如:

                    @Beanpublic Foo foo1(){return new Foo();}@Beanpublic Foo foo2(){return new Foo()}@Beanpublic Component component(Foo foo1 / foo2 通过此处指定引入的bean)

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

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

相关文章

SEO关键词策略:如何选取最适合你网站的关键词?

关键词作为SEO的基石&#xff0c;其选取策略直接影响着网站的排名和流量。本文将探讨如何制定有效的关键词策略&#xff0c;以提升网站的曝光度和转化率。 SEO工具&#xff1a;百度指数 首先&#xff0c;我们介绍了百度指数这一强大的SEO工具&#xff0c;它可以帮助我们指数化…

考虑到通信链路中断的(Delay Tolerant Network, DTN)

文章目录 A Study of DTN for Reliable Data Delivery from Space Station to Ground Stationabstractintroduction An Analytical Framework for Disruption of Licklider Transmission Protocol in Mars Communicationsabstract本文贡献 OVERVIEW OF RELIABLE DATA TRANSMISS…

资源池化单集群安装经验总结

登录linux环境通过跳板机用ssh命令连接分配的ip&#xff0c;将准备好的openGauss安装包以及xml文件上传到跳板机用scp命令传到自己的节点。 问题1&#xff1a;预安装包版本问题 解决方法&#xff1a;查看自己机器的系统&#xff0c;至openGauss官网下载正确版本的安装包 open…

Java使用spire.doc操作word文档(合并、插入文字图片和表格、替换书签)

一、引入依赖 <dependency><groupId>e-iceblue</groupId><artifactId>spire.office</artifactId><version>7.5.4</version> </dependency> 二、word操作 1、合并word文档 import com.spire.doc.Document; import com.spir…

SQL中为什么不能使用1=1条件

在SQL查询中&#xff0c;使用11条件是一种常见的技巧&#xff0c;它通常被用于动态构建查询条件或者简化查询语句。然而&#xff0c;尽管11条件在某些情况下可能会有一定的用处&#xff0c;但也存在一些不建议使用的原因&#xff1a; 性能问题&#xff1a;当使用11条件时&…

PostgreSQL教程(二十三):服务器管理(五)之客户端认证

当一个客户端应用连接一个数据库服务器时&#xff0c;它将指定以哪个PostgreSQL 数据库用户名连接&#xff0c;就像我们以一个特定用户登录一台 Unix 计算机一样。在 SQL 环境中&#xff0c;活动的数据库用户名决定对数据库对象的访问权限 — 详见教程二十四。因此&#xff0c;…

[three.js]搭建场景

背景 虽然一直在从事three.js方面的开发工作&#xff0c;但是都是在同事搭建好的场景下工作的。最近接手的任务让我可以从0到1搭建一个场景&#xff0c;顺便复习一下 搭建三维场景 <script lang"ts" setup> import { ref, onMounted } from vue; …

pycharm进入函数定义快捷键

在 PyCharm 中&#xff0c;你可以通过使用快捷键来快速进入函数&#xff0c;而不必通过鼠标点击。以下是几个常用的快捷键&#xff1a; 用鼠标选择函数后&#xff1a; Ctrl B&#xff1a;进入函数的定义。 Ctrl Alt B&#xff1a;进入函数的实现&#xff08;如果有的话&…

目标检测——摩托车头盔检测数据集

一、简介 首先&#xff0c;摩托车作为一种交通工具&#xff0c;具有高速、开放和稳定性差的特点&#xff0c;其事故发生率高&#xff0c;伤亡率排在机动车辆损伤的首位。因此&#xff0c;摩托车乘员头盔对于保护驾乘人员头部安全至关重要。在驾乘突发状况、人体受冲击时&#…

mysql 分组取前10条数据

mysql 分组取前10条数据 1.使用自定义函数 select name,gender,age,rankk from (selectname,gender,age,rankk:if(gengender,rankk1,1) as rankk,gen:gender from t_user,(select rankk:0,gen:null) temp order by gender,age asc) a where a.rankk < 10;2.使用row_nu…

#14vue3生成表单并跳转到外部地址的方式

1、背景 后端返回的json数据中包含一个json数组&#xff0c;此数组中是目标跳转地址所需要的form表单的数据。 2、跳转前的页面 const goto () > {finish.value true;request.post(/xxx/yyy,{zzz: zzz.value}).then(res > {const url res.data.submitUrlconst params…

拉电流、灌电流和漏电流

一、介绍 拉电流&#xff08;source current&#xff09;就是输出电流&#xff0c;即从芯片引脚向外流出的电流&#xff1b;灌电流&#xff08;sink current&#xff09;就是吸收电流&#xff0c;即从芯片引脚向内&#xff0c;流入芯片内的电流&#xff1b;漏电流就是泄露电流。…

在线安装MySQL5.7

在线安装MySQL 安装MySQL5.7 yum -y install mysql57-community-release-el7-10.noarch.rpm 若无可用安装包&#xff0c;执行下面这句 wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm 本地安装 yum localinstall -y mysql57-community-releas…

python异常机制

当代码出现异常后底下代码都不会被执行了&#xff0c;也就是程序崩溃了。当然能避免异常的话尽量避免但是有的时候这个是没有办法避免的。 异常处理 &#xff08;注&#xff1a;异常处理是从上往下处理&#xff0c;所以编写代码时要注意&#xff09; 语法 try:可能出现异常…

【漏洞复现】锐捷 EWEB auth 远程命令执行漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…

MySQL基础-----约束

目录 前言 一、概述 二、约束演示 三、外键约束 1.介绍 2.语法 四、删除/更新行为 1.CASCADE 2.SET NULL 前言 本期我们开始MySQL约束的学习&#xff0c;约束一般是只数据键对本条数据的约束&#xff0c;通过约束我们可以保证数据库中数据的正确、有效性和完整性。 下面…

vite+vue3门户网站菜单栏动态路由控制

门户网站用户端需要分板块展示&#xff0c;板块内容由管理端配置&#xff0c;包括板块名称&#xff0c;访问路径&#xff0c;路由组件&#xff0c;展示顺序&#xff0c;是否展示。如下图所示&#xff1a; 用户访问门户网站时&#xff0c;展示菜单跳转通过板块配置&#xff0c;动…

#微信小程序(布局、渲染层基础知识)

1.IDE&#xff1a;微信开发者工具 2.实验&#xff1a; 3.记录: &#xff08;1&#xff09;view&#xff08;类似于div&#xff09; &#xff08;2&#xff09;块级元素不占满一行且水平均分布局flex,justify(space-around) &#xff08;3&#xff09;滚动<scroll view sc…

从破局到引领,小牛电动确立“领航者”地位

一代人有一代人的使命&#xff0c;一代名企也有一代名企的长征。 当下&#xff0c;高端智能两轮电动车正在跨越鸿沟进入到主流市场中&#xff0c;其中&#xff0c;以小牛电动为代表的新势力正在经历由“颠覆者”到扮演“领航者”角色转型&#xff0c;引领市场顺势而上。 不破…