Spring Boot中的字段注入是如何工作的?

7
@Autowired
UserService userService;

`@Autowired` 注解在使用 `Constructor Injection` 或者 `Setter Injection` 时会发生什么?实际上是进行了 `Field Injection`。不要求解释 IOC 或 DI 如何工作,只是询问 Spring Boot 中的 Field Injection 具体内部实现过程。

可能是Spring框架中的依赖注入和控制反转是什么?的重复问题。 - Nikolai Shevchenko
1
我在询问字段注入的工作原理,而不是什么是Ioc或DI?@NikolayShevchenko - nitinsridar
1个回答

13

基本上,字段注入是一种依赖注入类型(显然),因此Spring根据字段类型和可能的注释(如@Qualifier)注入依赖项。

它是如何工作的?

当Spring创建一个Bean时,有一个特殊的Bean后置处理器org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

每个标记了@Autowired的字段都被Spring视为一个依赖项,所以它必须分析这些依赖项(在底层使用反射)并为每个字段从应用程序上下文中找到匹配项(按类型、指定的限定符等)。然后它通过反射将值设置到字段中。

我不想在这里引发“神圣战争”,但我只想提到我个人尽量避免使用这种类型的注入,因为它会有效地破坏依赖项的封装性,使具有自动连线字段的类无法进行单元测试。例如,如果你有像这样的东西:

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

  @Component
  class Bar {
  }

如果您自己创建Foo实例(例如在单元测试中),您没有明确的方法向Foo实例提供Bar依赖项而不依赖于Spring。

例如,构造函数注入可以解决这个问题。


2
是的,它既不是构造函数注入也不是设置器注入,而是字段注入,通过反射在幕后解决依赖注入问题。 - nitinsridar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接