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

【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 {
    @Bean
    public 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 {
    @Bean
    public String name(){
        return "wangwu";
    }
    @Bean
    public 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 {
    @Bean
    public String name(){
        return "wangwu";
    }
    @Bean
    public String name2(){
        return "zhaoliu";
    }
    @Bean
    public 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 {
    @Bean
    public String name2(){
        return "zhaoliu";
    }
    @Bean
    public 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 {
    @Bean
    public String name2(){
        return "zhaoliu";
    }
    @Bean
    public String name3(){
        return "tianqi";
    }
    @Bean
    public 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.kler.cn/a/532720.html

相关文章:

  • FinRobot:一个使用大型语言模型的金融应用开源AI代理平台
  • frida 入门
  • Redis代金卷(优惠卷)秒杀案例-多应用版
  • [mmdetection]fast-rcnn模型训练自己的数据集的详细教程
  • 实战:如何利用网站外部链接提升收录?
  • 鲸鱼算法 matlab pso
  • leetcode 901. 股票价格跨度
  • 【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)
  • 【25考研】南开软件考研复试复习重点!
  • redis实现延迟任务
  • 结构体排序 C++ 蓝桥杯
  • C++引用练习题
  • 基于springboot的电影评论网站(源码+数据库+文档)
  • PVE纵览-实现极致性能:在Proxmox VE中配置硬盘直通
  • Office / WPS 公式、Mathtype 公式输入花体字、空心字
  • 【C# 】图像资源的使用
  • 结合 vim-plug 安装并使用 Gruvbox 主题教程
  • 使用Posix共享内存区实现进程间通信
  • 二维数组 C++ 蓝桥杯
  • vue生命周期及其作用
  • 基于机器学习的布伦特原油价格的分析与研究
  • 通向AGI之路:人工通用智能的技术演进与人类未来
  • 数据库索引:秋招面试中的经典高频题目 [特殊字符](索引原理/操作/优缺点/B+树)
  • module_init宏是什么?
  • web-XSS-CTFHub
  • python学opencv|读取图像(五十六)使用cv2.GaussianBlur()函数实现图像像素高斯滤波处理