Pregunta ¿Qué es Inyección de Dependencia e Inversión de Control en Spring Framework?


La "inyección de dependencias" y la "inversión de control" se mencionan a menudo como las principales ventajas de utilizar el marco Spring para desarrollar marcos web.

¿Podría alguien explicar lo que es en términos muy simples con un ejemplo si es posible?


73
2018-02-22 21:16


origen


Respuestas:


  • Spring ayuda en la creación de aplicaciones débilmente acopladas debido a Inyección de dependencia.
  • En Spring, los objetos definen sus asociaciones (dependencias) y no se preocupan por cómo los obtendrán dependencias. Es responsabilidad de Spring proporcionar las dependencias necesarias para crear objetos.

Por ejemplo: Supongamos que tenemos un objeto Employee y tiene una dependencia en el objeto Address. Definiríamos un bean correspondiente a Employee eso definirá su dependencia en el objeto Address.

Cuando Spring intenta crear un Employee objeto, verá que Employee tiene una dependencia en Address, por lo que primero creará Address objeto (objeto dependiente) y luego inyectarlo en el Employee objeto.

  • Inversión de control (IOC) e Inyección de Dependencia (DI) se usan indistintamente. COI se logra a través de DI. DI es el proceso de proporcionar las dependencias y IOC es el resultado final de DI. (Nota: DI no es la única forma de lograr IOC. Existen otras maneras también.)

  • Por DI, la responsabilidad de crear objetos se desplaza de nuestro código de aplicación al contenedor de Spring; este fenómeno se llama COI.

  • La Inyección de Dependencia se puede realizar mediante inyección de setter o inyección de constructor.

157
2018-01-23 10:17



Escribiré mi comprensión simple de estos dos términos:

For quick understanding just read examples*

Inyección de Dependencia (DI):
La inyección de dependencia generalmente significa pasar un objeto dependiente como parámetro a un método, en lugar de hacer que el método cree el objeto dependiente.
Lo que significa en la práctica es que el método no tiene una dependencia directa en una implementación particular; cualquier implementación que cumpla con los requisitos se puede pasar como un parámetro.

Con esto, los objetos le dicen a tus dependencias. Y la primavera lo hace disponible.
Esto conduce a un desarrollo de aplicaciones débilmente acoplado.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT (if address is defines as dependency by Employee object)*.<br>

Contenedor de inversión de control (IoC):
Esta es una característica común de los marcos, IOC maneja objetos java 
- desde la instanciación hasta la destrucción a través de BeanFactory.
-Los componentes Java que son instanciados por el contenedor IoC se llaman beans, y el El contenedor de IoC administra el alcance de un bean, los eventos del ciclo de vida y cualquier característica de AOP para lo cual ha sido configurado y codificado.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

Al implementar Inversion of Control, un consumidor de software / objeto obtiene más controles / opciones sobre el software / los objetos, en lugar de ser controlado o tener menos opciones.

La inversión del control como una guía de diseño sirve para los siguientes propósitos:

Hay un desacoplamiento de la ejecución de una determinada tarea desde la implementación.
Cada módulo puede enfocarse en para qué está diseñado.
Los módulos no hacen suposiciones sobre lo que otros sistemas hacen, sino que dependen de sus contratos.
Reemplazar módulos no tiene ningún efecto secundario en otros módulos
 Aquí mantendré las cosas abstractas. Puede visitar los siguientes enlaces para obtener detalles sobre la comprensión del tema.
Una buena lectura con un ejemplo

Explicación detallada


19
2017-11-10 08:33



Spring: Spring es un contenedor de "Inversión de control" para la plataforma Java.

Inversión de control (IoC): Inversión de control (IoC) es una práctica de programación orientada a objetos mediante la cual el objeto acoplado está limitado en tiempo de ejecución por un objeto "ensamblador" y normalmente no se puede conocer en tiempo de compilación utilizando análisis estático.

Inyección de dependencias (DI): "La inyección de dependencias es un patrón de diseño de software que permite la eliminación de dependencias codificadas y permite cambiarlas, ya sea en tiempo de ejecución o en tiempo de compilación". -wiki.


6
2018-02-16 19:34



En Spring Objects están ligeramente acoplados, es decir, cada clase es independiente la una de la otra, de modo que todo se puede probar individualmente. Pero al usar esas clases, una clase puede depender de otras clases que primero necesitan ser creadas. Entonces, le decimos a la primavera que la clase A depende de la clase B. Entonces, al crear bean (como clase) para la clase A, crea una instancia de la clase B anterior a la clase A e inyecta eso en la clase A usando los métodos DI setter o constructor. Es decir, le estamos diciendo a la primavera la dependencia en tiempo de ejecución. Esto es DI. Como, estamos asignando la responsabilidad de crear objetos (beans), mantenerlos y sus agregaciones en Spring en lugar de codificarlo con fuerza, lo llamamos Inversion Of Control (IOC).


5
2018-04-27 07:07



Inversión de control (IOC): 

IoC es un patrón de diseño que describe la inversión del flujo de control en un sistema, por lo que el flujo de ejecución no está controlado por una pieza central de código. Esto significa que los componentes solo deben depender de las abstracciones de otros componentes y no son responsables de manejar la creación de objetos dependientes. En cambio, las instancias de objeto se suministran en tiempo de ejecución mediante un contenedor IoC a través de Dependency Injection (DI).

IoC permite un mejor diseño de software que facilita la reutilización, el acoplamiento flexible y las pruebas sencillas de los componentes de software.

Inyección de Dependencia (DI):

DI es una técnica para pasar dependencias al constructor de un objeto. Si el objeto se ha cargado desde el contenedor, el contenedor proporcionará automáticamente sus dependencias. Esto le permite consumir una dependencia sin tener que crear una instancia manualmente. Esto reduce el acoplamiento y le da un mayor control sobre la vida útil de las instancias de objeto.

haga clic para ver más


3
2017-10-10 11:35



Inversión de control- Significa dar el control de crear e instanciar los granos de primavera al contenedor Spring IOC y el único trabajo que hace el desarrollador es configurar los beans en el archivo xml de primavera.

Inyección de dependencia-

Considere una clase Empleado

class Employee { 
   private int id;
   private String name;
   private Address address;

   Employee() {
     id = 10;
     name="name";
     address = new Address();
   }


}

y considera la dirección de la clase

class Address {
   private String street;
   private String city;

   Address() {
     street="test";
     city="test1";

  }
}

En el código anterior, los valores de la clase de dirección se establecerán solo cuando se crea una instancia de la clase Employee, que es la dependencia de la clase Address en la clase Employee. Y Spring resuelve este problema utilizando el concepto de Inyección de Dependencia proporcionando dos formas de inyectar esta dependencia.

  1. Setter inyección

Método Setter en la clase Employee que toma una referencia de la clase Address

public void setAddress(Address addr) {
    this.address = addr;
}
  1. Inyección de constructor

Constructor en clase Empleado que acepta Dirección

Employee(Address addr) {
      this.address = addr;
}

De esta forma, los valores de la clase de Dirección se pueden establecer de forma independiente utilizando la inyección setter / constructor.


2
2018-06-27 07:24



Contenedor de IoC


El contenedor IoC es responsable de crear instancias, configurar y ensamblar los objetos. El contenedor IoC obtiene información del archivo XML y funciona en consecuencia. Las principales tareas realizadas por el contenedor IoC son:

  • Para instanciar la clase de aplicación
  • Para configurar el objeto
  • Para ensamblar las dependencias entre los objetos Hay dos tipos de contenedores de IoC. Son:

  • BeanFactory

  • ApplicationContext

Inyección de Dependencia (DI)

Dependency Injection (DI) es un patrón de diseño que elimina la dependencia del código de programación para que pueda ser fácil de administrar y probar la aplicación. La Inyección de Dependencia hace que nuestro código de programación esté débilmente acoplado.

Spring framework proporciona dos formas de inyectar dependencia

  • Por Constructor
  • Por el método Setter

1
2018-01-10 06:21



La forma tradicional de obtener la instancia de dirección en Employee sería mediante la creación de una nueva instancia de Address class. Spring crea todos los objetos dependientes ton us por lo que no debemos preocuparnos por el objeto.

Entonces en Spring solo dependemos del contenedor de resorte que nos proporciona el objeto de dependencia.


1
2018-01-23 12:34



Inversion of Control es un principio de diseño genérico de arquitectura de software que ayuda a crear marcos de software modulares y reutilizables que son fáciles de mantener.

Es un principio de diseño en el que se "recibe" el flujo de control de la biblioteca escrita genérica o del código reutilizable.

Para entenderlo mejor, veamos cómo solíamos codificar en nuestros primeros días de codificación. En los lenguajes de procedimiento / tradicionales, la lógica comercial generalmente controla el flujo de la aplicación y "Llama" al código / funciones genéricas o reutilizables. Por ejemplo, en una aplicación de consola simple, mi flujo de control está controlado por las instrucciones de mi programa, que pueden incluir las llamadas a algunas funciones generales reutilizables.

print ("Please enter your name:");
scan (&name);
print ("Please enter your DOB:");
scan (&dob);

//More print and scan statements
<Do Something Interesting>

//Call a Library function to find the age (common code)
print Age

En contraste, con IoC, los marcos son el código reutilizable que "llama" a la lógica comercial.

Por ejemplo, en un sistema basado en Windows, un marco ya estará disponible para crear elementos de IU como botones, menús, ventanas y cuadros de diálogo. Cuando escribo la lógica comercial de mi aplicación, serían los eventos de framework los que llamarían a mi código de lógica de negocios (cuando se dispara un evento) y NO lo contrario.

Aunque el código del marco no es consciente de mi lógica comercial, aún sabrá cómo llamar a mi código. Esto se logra usando eventos / delegados, devoluciones de llamada, etc. Aquí el Control de flujo es "Invertido".

Por lo tanto, en lugar de depender del flujo de control sobre los objetos enlazados estáticamente, el flujo depende del gráfico de objeto general y de las relaciones entre los diferentes objetos.

La Inyección de Dependencia es un patrón de diseño que implementa el principio de la IoC para resolver dependencias de objetos.

En palabras más simples, cuando intente escribir código, creará y usará diferentes clases. Una clase (Clase A) puede usar otras clases (Clase B y / o D). Entonces, la Clase B y D son dependencias de la clase A.

Una simple analogía será una clase Car. Un automóvil puede depender de otras clases como Engine, Tires y más.

Inyección de dependencias sugiere que, en lugar de las clases dependientes (Class Car aquí) que crean sus dependencias (Class Engine y clase Tyre), la clase debe inyectarse con la instancia concreta de la dependencia.

Vamos a entender con un ejemplo más práctico. Considere que está escribiendo su propio TextEditor. Entre otras cosas, puede tener un corrector ortográfico que le proporcione al usuario la posibilidad de verificar los errores ortográficos en su texto. Una implementación simple de dicho código puede ser:

Class TextEditor
{

    //Lot of rocket science to create the Editor goes here

    EnglishSpellChecker objSpellCheck;
    String text;

    public void TextEditor()

    {   

        objSpellCheck = new EnglishSpellChecker();

    }

    public ArrayList <typos> CheckSpellings()
    {

        //return Typos;

    }

}

A primera vista, todo se ve sonrosado. El usuario escribirá algo de texto. El desarrollador capturará el texto y llamará a la función CheckSpellings y encontrará una lista de Typos que mostrará al usuario.

Todo parece funcionar bien hasta que un buen día, cuando un usuario comienza a escribir francés en el Editor.

Para proporcionar soporte para más idiomas, necesitamos tener más SpellCheckers. Probablemente francés, alemán, español, etc.

Aquí, hemos creado un código estrictamente acoplado con SpellChecker "inglés" estrechamente relacionado con nuestra clase TextEditor, lo que significa que nuestra clase TextEditor depende de EnglishSpellChecker o, en otras palabras, EnglishSpellCheker es la dependencia de TextEditor. Necesitamos eliminar esta dependencia. Además, nuestro editor de texto necesita una forma de mantener la referencia concreta de cualquier corrector ortográfico en función de la discreción del desarrollador en tiempo de ejecución.

Entonces, como vimos en la introducción de DI, sugiere que la clase debería ser inyectada con sus dependencias. Por lo tanto, debe ser la responsabilidad del código de llamada la de inyectar todas las dependencias a la clase / código llamado. Entonces podemos reestructurar nuestro código como

interface ISpellChecker
{

    Arraylist<typos> CheckSpelling(string Text);

}

Class EnglishSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}



Class FrenchSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}

En nuestro ejemplo, la clase TextEditor debe recibir la instancia concreta del tipo ISpellChecker.

Ahora, la dependencia se puede inyectar en Constructor, una propiedad pública o un método.

Intentemos cambiar nuestra clase usando el Constructor DI. La clase TextEditor modificada se verá algo así como:

Class TextEditor

{

    ISpellChecker objSpellChecker;

    string Text;



    public void TextEditor(ISpellChecker objSC)

    {

        objSpellChecker = objSC;

    }



    public ArrayList <typos> CheckSpellings()

    {

        return objSpellChecker.CheckSpelling();

    }

}

Para que el código de llamada, al crear el editor de texto, pueda inyectar el tipo de SpellChecker apropiado en la instancia del editor de texto.

Puedes leer el artículo completo aquí


1
2017-07-16 12:26