spring实例化推断构造方法

需要用到的类:
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回选择写在前面的构造方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容