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。希望有人能帮助我。
答案 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种注射模式。