@Autowired UserService userService;
无论@@ Autowired批注是使用 构造函数注入 还是 Setter注入, 到底发生了什么。我知道这是现场注射。
我不是在问IOC或DI如何工作,我是在问Spring Boot中的Field Injection内部如何工作?
基本上,字段注入是一种注入类型(很明显),因此Spring会根据字段类型以及某些注释(例如@Qualifier)注入依赖项。
@Qualifier
它是如何工作的?
当Spring创建一个bean时,有一个特殊的Bean Post Processor org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
@Autowiredspring将每个标记为的字段视为依赖项,因此它必须分析这些依赖项(通过在内部使用反射),并从应用程序上下文中为每个字段找到匹配项(按类型,限定符(如果指定)等)。然后,它再次通过反射将值设置到字段中。
@Autowired
我不打算在这里开始“ 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实例。
Foo
Bar
例如,构造函数注入可解决此问题。