Это может быть наивный вопрос. В настоящее время я изучаю структуру 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.)
В первом примере также было бы тривиально изменять зависимости midstream:
// gotta chop it faster
saw = new ChainSaw();
sawMill.setSaw(saw);
sawMill.run();