属性注入在Spring中是一种依赖注入吗?

时间:2017-03-21 06:31:01

标签: spring dependency-injection property-injection

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”,我将其理解为“Property Injection”。就我而言,Spring的DI被提升为分离类,但上面的代码只是注入属性。我想知道属性注入是否基于Spring的DI。希望有人能帮助我。

3 个答案:

答案 0 :(得分:0)

注入意味着所需的依赖项(在您的情况下:一个简单的String)是从外部设置的(这可以手动完成,或者在您的情况下由DI容器 - spring完成)。所以你的班级不必知道&#34; msg&#34;已配置/检索,但它知道(在创建时)它收到正确的值。

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

答案 1 :(得分:0)

  

就我而言,Spring的DI被提升为脱离课程,   但上面的代码只是注入属性。我不知道是否   属性注入基于春季的DI。

假设您的HelloWorld类依赖于其他名为LanguageHelper的接口,那么您可以在运行时动态注入LanguageHelper的实现(Spring容器创建/管理对象)这些类,如果在类路径上找到的话),只需在XML中指定实现类名,如下所示(或者你可以使用Annotations):

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

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

但是,在你的情况下,它是一个简单的String值,你想在运行时动态地注入你的bean (而不是直接在你的类中硬编码)。所以,它是一个没有额外依赖性需要评估的注入,而只是使用提供的setter方法设置值。

所以,所有关于我们如何为未来的变化(可能是简单的值或其他类实现)松散耦合,而不是直接在其中进行硬编码。

答案 2 :(得分:0)

Martin Flowers "Inversion of Control Containers and the Dependency Injection pattern"应该是关于控制反转设计模式的精彩读物。

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