【问题标题】:How Field Injection in Spring Boot works internally?Spring Boot 中的字段注入如何在内部工作?
【发布时间】:2019-12-14 15:32:57
【问题描述】:
@Autowired
UserService userService;

无论是使用 Constructor Injection 还是 Setter Injection,`@Autowired 注解中究竟发生了什么。我知道是字段注入。

我不是在问 IOC 或 DI 是如何工作的,我是在问 Spring Boot 中的字段注入如何在内部工作?

【问题讨论】:

标签: spring-boot


【解决方案1】:

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

它是如何工作的?

Spring 创建 bean 时,有一个特殊的 Bean Post Processor 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 的实例时(例如在单元测试中),您没有明确的方法可以在不依赖 spring 的情况下将 Bar 依赖项提供给 Foo 实例。

构造函数注入例如解决了这个问题。

【讨论】:

  • 是的,它既不是构造函数也不是setter注入,它是字段注入,通过引擎盖下的反射解决DI
猜你喜欢
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2018-09-13
  • 2018-07-28
相关资源
最近更新 更多