需要用到的类:
public class User{
private String name;
}
@ComponentScan("xxx")
public class Config{
@Bean
private User user(){
return new User();
}
}
1、声明一个构造方法,则使用该构造方法
@Component
public class UserService {
private User user;
public UserService(User user) {
this.user = user;
System.out.println("一个参数的构造方法");
}
}
2、没有构造方法,则默认使用无参的
3、有多个构造方法
@Component
public class UserService {
private User user;
public UserService(User user) {
this.user = user;
System.out.println("一个参数的构造方法");
}
public UserService(User user, User user1) {
this.user = user;
System.out.println("2个参数的构造方法");
}
}
则启动报错,因为spring此时不知道该用哪个构造方法,解决方法:
①加入无参的构造方法
②给其中一个构造方法加上@Autowired注解(默认required=true)
若2个都加上@Autowired注解,则也会报错
若2个都加上@Autowired(required=false),则表示告诉spring这2个构造方法都可以用,这时候spring的选择逻辑:
首先看参数多的构造方法是否可用,2个参数的构造方法需要注入2个User类型的Bean,当容器中只有一个User类型的Bean时,可以根据类型注入2个参数,因此spring 判定2个参数的构造方法可用,优先选择该构造方法;
假如在容器中再增加一个User类型的Bean,
public class Config{
@Bean
private User user(){
return new User();
}
@Bean
private User user2(){
return new User();
}
}
则此时spring除了根据类型匹配,还会根据名称匹配,在匹配第二个参数时发现不存在类型为User ,名称为user1的Bean,因此spring 判定2个参数的构造方法不可用,选择一个参数的构造方法;
假如有多个可用且参数长度一样的构造方法,则spring回选择写在前面的构造方法。