Spring 进行依赖注入的方式

Ways in which Spring do Dependency Injection

我在 Spring 框架方面有一些经验。 Spring 通常使用 constructor injectionsetter injection 进行 DI。这个概念我很舒服。现在,除此之外,我还看到 Spring 像这样进行 DI:

@Autowired
DataSource myData;

@Resouce(name="someName")
SomeDependency dependency;

Spring在使用注解做DI的时候利用了什么机制? Spring 在这些情况下是否使用 constructorsetter 注入,或者注解驱动方法完全是一种不同的依赖注入方式?

简单世界中的任何解释都会有很大帮助。

您可以通过@Autowired方式进行setter注入和构造函数注入。

@Autowired
private Person person;

@Autowired
public Customer(Person person) {
    this.person = person;
}

默认情况下按类型自动装配注入 bean。在幕后,它通过 java 反射机制进行注入。所以你可以用注释配置做同样的事情(你用 xml 配置完成的)。

另外想补充一点,构造函数注入更可取(除了参数太多的情况)。 构造函数注入的主要优点:

  • 您无法避免将参数传递给构造函数并在没有它们的情况下创建 bean。

所以在大多数情况下,您希望注入依赖项,而 setter 注入并不能保证这一点(您可能会在错误的 setter 注入期间出现这个恼人的 NPE)。

使用自动装配的具体规则: http://docs.spring.io/spring/docs/4.2.7.RELEASE/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html