Esto podría ser una pregunta ingenua. Actualmente estoy aprendiendo el marco Spring y la inyección de dependencia . Si bien el principio básico de DI es bastante fácil de comprender, no es inmediatamente obvio por qué se necesita un marco elaborado para implementarlo.Comprender la necesidad de un marco DI
considerar lo siguiente:
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");
}
}
Posteriormente, se podría simplemente hacer:
Saw saw = new HandSaw();
SawMill sawMill = new SawMill();
sawMill.setSaw(saw);
sawMill.run();
lo que sería equivalente a:
<bean id="saw" class="HandSaw"/>
<bean id="sawMill" class="SawMill">
<property name="saw" ref="saw"/>
</bean>
más:
ApplicationContext context = new ClassPathXmlApplicationContext("sawmill.xml");
SawMill springSawMill = (SawMill)context.getBean("sawMill");
springSawMill.run();
Concedido, este es un ejemplo de contribución, y con relaciones de objeto más complejas podría ser más eficiente almacenar un archivo XML que escribirlo programáticamente, pero seguramente debe haber más que eso.
(Sé el marco de Primavera es más que eso, pero estoy pensando en la necesidad de un contenedor de DI.)
En el primer ejemplo, también sería trivial para cambiar las dependencias de la mitad del chorro:
// gotta chop it faster
saw = new ChainSaw();
sawMill.setSaw(saw);
sawMill.run();
Esto es muy similar a http://stackoverflow.com/questions/131975. –
El objetivo principal de DI es facilitar la configuración de las aplicaciones y hacer las pruebas más fáciles/posibles (DI le permite intercambiar dependencias fácilmente) –