1

XML

<bean name="helloWorld" class="com.company.HelloWorld">
    <property name="msg" value="messaging"/>
</bean>

JAVA

package com.company;

// ...

public class HelloWorld {
    private String msg;
    public void setMsg(String msg) { this.msg = msg; }
}

如上图,属性“msg”通过“setMsg”方法注入到“this.msg”中,我理解为“属性注入”。就我而言,Spring的DI被提升为解耦类,但上面的代码只是注入属性。我想知道属性注入是否基于Spring中的DI。希望有人可以帮助我。

4

3 回答 3

0

就我而言,Spring的DI被提升为解耦类,但上面的代码只是注入属性。我想知道属性注入是否基于Spring中的DI。

假设您的类HelloWorld依赖于其他一些名为XML 如下图所示(也可以使用 Annotations):LanguageHelperLanguageHelper

<bean id = "helloWorld" class = "com.company.HelloWorld">
      <property name = "languageHelper" ref = "languageHelper"/>
</bean>

<bean id = "languageHelper" class = "com.company.LanguageHelperImpl"></bean>

但是,在您的情况下,这是一个简单的String值,您希望在运行时动态地注入到您的 bean 中(而不是直接在您的类中进行硬编码)。因此,它是一种不需要评估额外依赖项的注入,而只是使用提供的setter方法设置值。

因此,这一切都是关于我们如何松散耦合类(可能是简单的值或其他类实现)以供将来更改,而不是直接在其中进行硬编码。

于 2017-03-21T06:47:56.297 回答
0

Martin Flowers “Inversion of Control Containers and the Dependency Injection pattern”应该是一本关于 Inversion of Control 设计模式的好书。

根据 Martin Flower 的帖子,可以使用构造函数、setter 注入和接口进行注入。Spring 确实支持所有 3 种注入模式。

于 2017-03-21T06:48:39.247 回答
0

注入意味着所需的依赖项(在您的情况下:一个简单的字符串)是从外部设置的(这可以手动完成,或者在您的情况下通过 DI 容器 - spring)。因此,您的类不必知道“msg”的值在哪里配置/检索,但它知道(在创建时)它接收到正确的值。

回答您的问题:是的,属性注入是一种依赖注入。另一种可能性(通常是首选)是构造函数注入,您的类必须在构造函数中声明它的所有依赖项。DI 框架(spring)然后在对象构造期间注入依赖项......

于 2017-03-21T06:41:47.077 回答