spring注入调用哪个构造器
-
Spring在进行Bean的实例化和依赖注入时,会根据特定的规则来选择调用哪个构造器。具体的规则如下:
-
默认构造器:如果目标Bean类中有一个无参构造器,Spring会优先选择调用这个构造器进行实例化。
-
有参构造器:如果目标Bean类中没有无参构造器,或者有无参构造器但是被私有化了,Spring会选择调用带有参数的构造器,但此时要求定义的所有参数在Spring的容器中都有对应的Bean,并且这些Bean可以通过自动注入的方式进行实例化。
-
注解标记:如果目标Bean类中有多个构造器,并且这些构造器都被注解标记了,那么Spring会优先选择标有
@Autowired、@Resource或@Inject等注解的构造器进行实例化和依赖注入。 -
明确指定:如果以上规则无法准确选择到符合条件的构造器,我们可以通过在配置文件中显式指定要使用的构造器,或者在Java类中使用
@Autowired注解来明确声明要使用的构造器。
需要注意的是,通过配置文件或者注解指定构造器时,要确保所选择的构造器参数在Spring容器中都有对应的Bean,以便能够成功实例化和注入依赖。
总结起来,Spring在进行构造器的选择时会优先考虑默认构造器,然后是有参构造器,并且会根据注解标记和明确指定来选择适合的构造器进行实例化和注入。
1年前 -
-
Spring在进行对象的注入时,会根据构造器的参数和注解的匹配程度来确定调用哪个构造器。具体确定构造器的过程如下:
-
如果没有定义任何构造器,则Spring将使用默认的无参构造器来实例化对象。
-
如果有多个构造器,Spring会根据构造器参数的个数和类型来选择匹配的构造器。如果只有一个构造器匹配成功,则选择该构造器;如果有多个构造器都匹配成功,则抛出异常。
-
如果有多个构造器都匹配成功,但是其中一个构造器标有
@Autowired注解,那么Spring将优先选择标有@Autowired注解的构造器。 -
如果有多个构造器都匹配成功,但是没有构造器标有
@Autowired注解,那么Spring将选择参数最多的构造器。 -
如果有多个构造器都匹配成功,但是参数个数相同,那么Spring将抛出异常,提示无法确定要使用的构造器。
总结起来,Spring注入调用哪个构造器的选择规则如下:
-
优先选择标有
@Autowired注解的构造器。 -
如果没有标有
@Autowired注解的构造器,选择参数最多的构造器。 -
如果有多个构造器都符合条件,选择其中一个并抛出异常。
需要注意的是,如果要注入的依赖对象在Spring容器中没有找到对应的Bean,那么无法通过构造器注入,而会抛出BeanCreationException异常。
1年前 -
-
Spring的依赖注入(Dependency Injection, DI)可以通过多种方式来实现对Bean的构造器注入。Spring会根据注入的方式选择合适的构造器进行注入。
下面介绍几种常见的构造器注入方式。
- 默认构造器注入:如果Bean有一个无参构造器,Spring会使用该构造器进行注入。
public class MyBean { public MyBean() { // 默认构造器 } }- 单个构造器注入:如果Bean有多个构造器,但只有一个构造器带有@Autowired注解或者没有注解,Spring会选择使用这个构造器进行注入。
public class MyBean { public MyBean() { // 默认构造器 } @Autowired public MyBean(OtherBean otherBean) { // 带有@Autowired注解的构造器 } public MyBean(String name) { // 不带@Autowired注解的构造器 } }- 带有@Qualifier注解的构造器注入:如果Bean有多个构造器带有@Autowired注解,并且它们的参数类型一样,可以使用@Qualifier注解指定要注入的构造器。
public class MyBean { public MyBean() { // 默认构造器 } @Autowired public MyBean(@Qualifier("otherBean1") OtherBean otherBean) { // 带有@Autowired注解的构造器1 } @Autowired public MyBean(@Qualifier("otherBean2") OtherBean otherBean) { // 带有@Autowired注解的构造器2 } }- 使用XML配置的构造器注入:可以使用
标签在XML配置文件中指定要注入的构造器参数。
<!-- otherBean1构造器注入 --> <bean id="myBean1" class="com.example.MyBean"> <constructor-arg name="otherBean" ref="otherBean1" /> </bean> <!-- otherBean2构造器注入 --> <bean id="myBean2" class="com.example.MyBean"> <constructor-arg name="otherBean" ref="otherBean2" /> </bean>综上所述,Spring的依赖注入可以通过多种方式来选择构造器进行注入,具体选择哪个构造器取决于注入的方式和参数的匹配情况。
1年前