mvc inyeccion ejemplo dependencias context autowire anotaciones annotation spring dependencies controls code-injection inversion

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



spring core ejemplo (8)

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?


En Spring Objects están ligeramente acoplados, es decir, cada clase es independiente la una de la otra para que todo pueda ser probado 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).


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.


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.


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.


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

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, el COI administra 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 denominan beans, y el contenedor IoC administra el ámbito de un bean, los eventos del ciclo de vida y cualquier característica AOP para la que se haya 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 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


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


  • Spring ayuda a crear aplicaciones débilmente acopladas debido a Dependency Injection .
  • En primavera, los objetos definen sus asociaciones (dependencias) y no se preocupan por cómo obtener esas dependencias ; ahora es responsabilidad de Spring proporcionar las dependencias necesarias para crear objetos.

Por ejemplo : supongamos que tenemos un objeto Empleado y tiene una dependencia en el objeto Dirección. Entonces definimos un bean correspondiente a Employee donde definirá su dependencia en la dirección del objeto. Cuando Spring intenta crear un Object Employee, ve que Employee tiene una dependencia en Object Address, por lo que primero creará el objeto Address (objeto dependiente) y luego lo inyectará en el objeto Employee.

  • La Inversión de Control (IOC) y la 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, también hay otras formas ).

  • Por DI, la responsabilidad de crear objetos se desplaza desde nuestro código de aplicación al contenedor de resorte, por lo que el fenómeno se denomina IOC.

  • La Inyección de Dependencia se puede hacer mediante inyección de setter, inyección de constructor.