这里就来详细讲解一下Spring启动过程中实例化部分代码的分析之Bean的推断构造方法。
背景知识
在Spring框架中,Bean是指由IOC容器管理的对象。在IOC容器初始化的过程中,需要实例化Bean类并将实例对象放入容器中,在这个过程中需要调用Bean的构造函数,Spring默认使用无参构造函数进行实例化。但如果Bean没有无参构造函数,就需要使用其他构造函数进行实例化。
对于存在多个构造函数的情况,Spring会使用构造函数注解或者参数类型匹配的方式进行构造函数的推断。
构造函数注解方式推断
假设我们有一个名为UserService的Bean类,它有两个构造函数,一个是无参构造函数,另一个是使用@ Autowired注解进行依赖注入的构造函数。
public class UserService {
private UserDao userDao;
public UserService() {}
@Autowired
public UserService(UserDao userDao) {
this.userDao = userDao;
}
// ...
}
在这种情况下,Spring会选择使用带有@Autowired注解的构造函数进行实例化。
参数类型匹配方式推断
如果没有使用@Autowired注解进行标注,Spring会尝试使用参数类型匹配的方式进行构造函数的推断。在这种情况下,Spring会遍历Bean类的所有构造函数,按照参数的类型进行匹配,找到匹配度最高的构造函数进行实例化。
下面示例我们有一个名为OrderService的Bean类,它有三个构造函数,分别是:
public class OrderService {
private UserDao userDao;
private OrderDao orderDao;
private LogDao logDao;
public OrderService() {}
public OrderService(UserDao userDao, OrderDao orderDao) {
this.userDao = userDao;
this.orderDao = orderDao;
}
public OrderService(UserDao userDao, OrderDao orderDao, LogDao logDao) {
this.userDao = userDao;
this.orderDao = orderDao;
this.logDao = logDao;
}
// ...
}
在这种情况下,假设我们在Spring配置文件中只注入了UserDao和OrderDao两个Bean,则Spring会选择使用有两个参数的构造函数进行实例化,因为这个构造函数的参数类型是与注入的Bean类型最匹配的。
如果我们在Spring配置文件中既注入了UserDao和OrderDao,又注入了LogDao,则Spring会选择使用有三个参数的构造函数进行实例化,因为这个构造函数的参数类型是与注入的Bean类型最匹配的。
综上所述,Spring会使用构造函数注解或参数类型匹配的方式进行构造函数的推断,如果都没有匹配上,就会抛出异常。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring启动过程中实例化部分代码的分析之Bean的推断构造方法 - Python技术站