一尘不染

Spring Boot中的字段注入如何在内部工作?

spring-boot

@Autowired
UserService userService;

无论@@ Autowired批注是使用 构造函数注入 还是 Setter注入, 到底发生了什么。我知道这是现场注射。

我不是在问IOC或DI如何工作,我是在问Spring Boot中的Field Injection内部如何工作?


阅读 302

收藏
2020-05-30

共1个答案

一尘不染

基本上,字段注入是一种注入类型(很明显),因此Spring会根据字段类型以及某些注释(例如@Qualifier)注入依赖项。

它是如何工作的?

当Spring创建一个bean时,有一个特殊的Bean Post Processor
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

@Autowiredspring将每个标记为的字段视为依赖项,因此它必须分析这些依赖项(通过在内部使用反射),并从应用程序上下文中为每个字段找到匹配项(按类型,限定符(如果指定)等)。然后,它再次通过反射将值设置到字段中。

我不打算在这里开始“ holly-
wars”,但我只想提到我个人试图避免使用这种类型的注入,因为它有效地打破了对依赖关系的封装,使带有自动装配字段的类无法进行单元测试。例如,如果您有以下内容:

  @Component
  class Foo {
     @Autowired 
     private Bar bar;
     public Foo() {} // no-arg construction that exists by default
  }

  @Component
  class Bar {
  }

然后,当您自己创建一个实例时Foo(例如在单元测试中),您没有明确的方法可以在不依赖spring的情况下将Bar依赖项提供给Foo实例。

例如,构造函数注入可解决此问题。

2020-05-30