这可能是一个幼稚的问题。我正在学习Spring框架和依赖注入(DI)。虽然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框架不仅如此,但我在考虑依赖注入容器的需求。)
在第一个例子中,更改依赖项也是微不足道的:
// gotta chop it faster
saw = new ChainSaw();
sawMill.setSaw(saw);
sawMill.run();