Ce pourrait être une question naïve. Je suis présentement en train d'apprendre le framework Spring et l'injection de dépendance. Alors que le principe de base de la DI est plutôt facile à saisir, il n'est pas immédiatement évident pourquoi vous avez besoin d'élaborer un cadre pour la mettre en œuvre.
Considérez les points suivants:
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");
}
}
Ensuite, vous pouvez tout simplement faire:
Saw saw = new HandSaw();
SawMill sawMill = new SawMill();
sawMill.setSaw(saw);
sawMill.run();
Ce qui serait équivalent à:
<bean id="saw" class="HandSaw"/>
<bean id="sawMill" class="SawMill">
<property name="saw" ref="saw"/>
</bean>
plus:
ApplicationContext context = new ClassPathXmlApplicationContext("sawmill.xml");
SawMill springSawMill = (SawMill)context.getBean("sawMill");
springSawMill.run();
Accordé, c'est une contrieved exemple, et plus complexes les relations d'objet, il peut être plus efficace pour ranger un fichier XML que l'écriture par programme, mais il doit sûrement y avoir plus que cela?
(Je sais que le framework Spring est plus que ça, mais je suis en train de penser à la nécessité d'un conteneur d'injection de dépendances.)
Dans le premier exemple il devrait également être facile à changer les dépendances au milieu du gué:
// gotta chop it faster
saw = new ChainSaw();
sawMill.setSaw(saw);
sawMill.run();