【发布时间】:2010-10-04 18:40:57
【问题描述】:
这可能是一个幼稚的问题。我目前正在学习 Spring 框架和依赖注入。虽然 DI 的基本原理很容易掌握,但为什么需要一个复杂的框架来实现它并不是很明显。
考虑以下几点:
public abstract class Saw
{
public abstract void cut(String wood);
}
public class HandSaw extends Saw
{
public void cut(String wood)
{
// chop it up
}
}
public class ChainSaw extends Saw
{
public void cut(String wood)
{
// chop it a lot faster
}
}
public class SawMill
{
private Saw saw;
public void setSaw(Saw saw)
{
this.saw = saw;
}
public void run(String wood)
{
saw.cut("some wood");
}
}
那么你可以这样做:
Saw saw = new HandSaw();
SawMill sawMill = new SawMill();
sawMill.setSaw(saw);
sawMill.run();
相当于:
<bean id="saw" class="HandSaw"/>
<bean id="sawMill" class="SawMill">
<property name="saw" ref="saw"/>
</bean>
加:
ApplicationContext context = new ClassPathXmlApplicationContext("sawmill.xml");
SawMill springSawMill = (SawMill)context.getBean("sawMill");
springSawMill.run();
当然,这是一个人为的例子,对于更复杂的对象关系,隐藏 XML 文件可能比以编程方式编写它更有效,但肯定还有更多的东西吗?
(我知道 Spring 框架不止于此,但我正在考虑需要一个 DI 容器。)
在第一个示例中,在中途更改依赖项也很简单:
// gotta chop it faster
saw = new ChainSaw();
sawMill.setSaw(saw);
sawMill.run();
【问题讨论】:
-
DI 的主要目的是简化应用程序配置并使测试更容易/可能(DI 让您轻松交换依赖项)
标签: java spring dependency-injection