@Autowired的构造函数调用如何工作?

我正在学习Spring Boot框架,并且想了解@Autowired注释的工作原理。我知道在Spring

Boot中我们有一个上下文,并且在该上下文中有可以通过@Autowired注释彼此连接的bean,这是因为在Spring

Boot中我们具有依赖项注入,但是构造函数是如何调用的?

我有这样的服务:

@Service

public class MyService {

public MyService() {

// do something

}

}

在课堂上,我有:

public class MyClass {

@Autowired

MyService service;

}

问题是:

MyService执行被调用的构造函数和“执行某事”还是将其调用为空的构造函数,因此我不能依靠执行“执行某事”的事实吗?

回答:

回答:

在创建bean时,Spring将不得不调用目标bean类包含的构造函数:

  1. 如果没有定义构造函数,那么Spring将调用编译器生成的隐式默认构造函数。
  2. 如果没有显式定义一个no-args构造函数,则Spring会调用该构造函数,因为没有其他定义的构造函数。
  3. 如果定义了一个构造函数,它需要一些依赖关系,那么Spring将不得不调用该构造函数并为其提供依赖关系。(从Spring 4.3开始,您甚至不必使用标记该构造函数。@Autowired
  4. 如果定义了多个args构造函数,则您将不得不解决歧义,因为Spring将不知道要选择哪个。(然后,您可以用标记其中之一,@Autowired或使用配置类来定义您的bean)。

回答:

Spring IOC容器(应用程序上下文)负责保存bean并在需要时返回它们。要创建上下文,您必须告诉Spring在哪里寻找bean定义:您可以提供xml文件,java配置或启用给定程序包中组件的自动扫描。当创建Spring上下文时,它必须创建bean。它将尝试调用构造函数,并为需要它们的bean提供任何依赖关系。

在您的示例中,MyClass将为上下文创建实例时,它将调用MyClassclass的默认构造函数,然后通过反射设置其依赖关系。

但是,场注入通常不是一个好主意,因为您可能无法测试此类组件。构造器或setter注入是更好的选择。

如果您将其更改MyClass为:

public class MyClass {

private MyService service;

@Autowired

public MyClass(MyService service) {

this.service = service;

}

}

在这里,您提供了自己的构造函数-

请注意,在这种情况下,不会生成任何默认构造函数。因此,Spring将必须调用您提供的构造函数并满足其依赖性。如果没有可以注入的依赖项,则将引发异常。

MyService myService = new MyService();

MyClass myclass = new MyClass(myService);

以上是 @Autowired的构造函数调用如何工作? 的全部内容, 来源链接: utcz.com/qa/430884.html

回到顶部