Это может быть наивный вопрос. В настоящее время я изучаю среду 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();