【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,报错;