一、实例化前就通过扩展节点将对象实例化出来,会导致什么结果?
- 1、该实力对象中需要依赖注入的属性全部为空,spring不会对该实例对象进行依赖注入;
- 2、该对象会跳过实例化后的一系列步骤,直接到达初始化后的阶段。也就意味着某些初始化前、初始化过程的的步骤是不能执行的。
二、spring实例化对象的方式有哪几种?@Bean使用的是哪一种?
spring实例化对象的方式大方向上有两种,一种是通过实现Supplier接口来获取实例对象,另一种是通过factoryMethod创建实例对象;
@Bean使用的是factoryMethod来创建实例对象的;
需要注意的是如果@Bean修饰的方法是static修饰,那么spring不会创建工厂对象来使用工厂方法创建实例,而是会在当前类的内部生成一个实例化对象的方法来创建当前对象
三、spring推断构造方法的执行逻辑是怎么样的?
- 如果该对象中只有一个构造方法(无论是有参构造还是无参构造),那么spring会默认使用该方法来进行对象的实例化创建。
- 如果有一个无参构造和多个有参数构造,且所有构造方法上都没有加上@Autowired注解,那么spring会默认使用无参数构造方法来进行实例化对象。
- 如果有多个有参数构造,但是没有无参构造。会判断是否存在一个有参构造方法上含有@Autowired注解,有的话就会使用含有该注解的方法来实例化对象,没有的话则抛出异常。
- 如果有多个有参数构造和一个无参数构造,每个有参构造方法上都有@Autowired(required = false)的注解,那么spring会选取参数最多的那个,且每个参数都能从spring容器中找到的构造方法来创建对象。
- 如果有多个有参数构造和一个无参数构造,每个有参构造方法上都有@Autowired(required = false)的注解,且有两个构造方法的参数个数相同且是最多,那么spring会对这些参数进行评分,评分越低的表明越符合,spring就会用这个评分最低的来进行对象的创建。如果评分一样则会跑出异常。