当前位置: 首页 > news >正文

【IoCDI】_@Bean的参数传递

目录

1. 不创建参数类型的Bean

2. 创建一个与参数同类型同名的Bean

3. 创建多个与参数同类型,其中一个与参数同名的Bean

4. 创建一个与参数同类型不同名的Bean

5. 创建多个与参数同类型但不同名的Bean


对于@Bean修饰的方法,也可能需要从外部传参,现说明@Bean的参数传递问题。

仍以BeanConfig类的userInfo方法为例,假设当前方法需传递一个名为name的String类型的参数。

1. 不创建参数类型的Bean

BeanConfig类内容如下:

package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}

运行程序,启动日志报错如下:

即将参数name也视为一个bean,该bean的类型为String,当前并未定义该bean,故报错。

2. 创建一个与参数同类型同名的Bean

修改BeanConfig类,为其增加一个名为name的String类型的Bean如下:

package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic String name(){return "wangwu";}@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}

保持启动类内容不变,重新启动程序:

可见此时userInfo方法接收参数成功;

3. 创建多个与参数同类型,其中一个与参数同名的Bean

当前userInfo方法需要一个名为name类型为String的参数,现创建两个String类型的Bean,一个Bean(name)与形参名保持一致,另外一个Bean(name2)与形参名不同:

package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic String name(){return "wangwu";}@Beanpublic String name2(){return "zhaoliu";}@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}

重新启动程序,日志如下:

可见当前userInfo方法接收了与参数名相同(name)的那个Bean;

4. 创建一个与参数同类型不同名的Bean

当前userInfo方法需要的参数类型为String,现创建一个String类型的Bean,该Bean的名称(name2)与形参名称(name)不同:

package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic String name2(){return "zhaoliu";}@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}

运行程序,日志如下:

可见当前userInfo方法接收了与参数虽然名称不同(name)但类型相同(String)的那个Bean;

5. 创建多个与参数同类型但不同名的Bean

当前userInfo方法需要的参数类型为String,现创建两个String类型的Bean,两个Bean的名称(name2和name3)都与形参名称(name)不同:

package com.example.iocdemo1.Config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class BeanConfig {@Beanpublic String name2(){return "zhaoliu";}@Beanpublic String name3(){return "tianqi";}@Beanpublic UserInfo userInfo(String name){UserInfo userInfo1=new UserInfo();userInfo1.setId(1);userInfo1.setName(name);userInfo1.setAge(20);return userInfo1;}
}

报错如下:

总结@Bean接收参数的原则:

1、首先根据类型获取Bean,若没有与参数类型匹配的Bean则报错

2、若满足类型要求的Bean有多个,则优先获取与参数同名的Bean。 

3、若存在一个名称虽不匹配但类型匹配的Bean,则该Bean也可被@Bean接收

4、若存在多个名称虽不匹配但类型匹配的Bean,则无法匹配Bean,报错;

http://www.lryc.cn/news/531337.html

相关文章:

  • [特殊字符] ChatGPT-4与4o大比拼
  • 【模型】Bi-LSTM模型详解
  • directx12 3d开发过程中出现的报错 一
  • Ubuntu 24.04 安装 Poetry:Python 依赖管理的终极指南
  • 读写锁: ReentrantReadWriteLock
  • 上海路网道路 水系铁路绿色住宅地工业用地面图层shp格式arcgis无偏移坐标2023年
  • 爬虫学习笔记之Robots协议相关整理
  • Python小游戏29乒乓球
  • 220.存在重复元素③
  • 使用 Go 语言调用 DeepSeek API:完整指南
  • AJAX笔记原理篇
  • ubuntu直接运行arm环境qemu-arm-static
  • 尝试把clang-tidy集成到AWTK项目
  • 一文了解性能优化的方法
  • 【怎么用系列】短视频戒断——对推荐算法进行干扰
  • C#中的委托(Delegate)
  • PostCss
  • Linux 系统上安装 Docker 并进行配置
  • DeepSeek 等 AI 技术能否推动股市的繁荣?
  • 【网络】应用层协议http
  • 大数据数仓实战项目(离线数仓+实时数仓)2
  • 测试csdn图片发布
  • 站在JavaScript的视角去看,HTML的DOM和GLTF的Json数据。
  • 传输层协议 UDP 与 TCP
  • VSCode源码分析参考资料
  • 使用VCS对Verilog/System Verilog进行单步调试的步骤
  • ROS-激光雷达-消息包格式-获取激光雷达数据-激光雷达避障
  • c++之模板进阶
  • 关于Internet Download Manager(IDM)强制下载合并相关二次开发
  • 鸿蒙HarmonyOS Next 视频边播放边缓存- OhosVideoCache