IoC y DI
El Contenedor de Spring es el componente central del Spring Framework que gestiona la creación, configuración y ciclo de vida de los beans (objetos) dentro de una aplicación. El Contenedor de Spring también se conoce como el contenedor IoC.
Una dependencia se refiere a cualquier clase que requiere que se le inyecten otros objetos para funcionar correctamente, y esta cadena de dependencias puede continuar indefinidamente. Normalmente, para crear un objeto con dependencias, debemos inicializarlo explícitamente usando el operador new y especificar la clase.
Pero ahí es donde entra Spring con Inversion of Control y Dependency Injection. La idea es que Spring asume la responsabilidad de crear y gestionar las dependencias. En lugar de gestionar manualmente la configuración, simplemente anotamos las clases necesarias y Spring las crea automáticamente y administra su ciclo de vida dentro de su contexto.
Una de estas anotaciones es @Component, que colocamos encima de la clase.
BeanExample.java
123@Component public class BeanExample { }
Este enfoque desvía la atención de la gestión manual de dependencias, permitiendo a los desarrolladores concentrarse en la lógica de negocio mientras Spring se encarga de las tareas de infraestructura relacionadas con la creación de objetos y la gestión de dependencias.
¿Cómo funciona el contenedor de Spring?
Cuando la aplicación se inicia, se inicializa el Contenedor de Spring. Comienza escaneando las clases en busca de anotaciones como @Component, @Service, @Repository y @Configuration.
@Component es una anotación general que hace que una clase sea gestionada por Spring, permitiendo que se registre como un bean.
@Service, @Repository y @Controller son versiones más especializadas de @Component. Cumplen el mismo propósito pero indican el rol específico de la clase: @Service para la lógica de negocio, @Repository para el acceso a datos y @Controller para el manejo de solicitudes web.
@Configuration se utiliza para clases que contienen definiciones de beans y configuración de la aplicación.
Al marcar una clase con una de estas anotaciones, se asegura que se convierta en un bean dentro del contexto de Spring.
Una vez que se identifican las clases, el contenedor procede a crear instancias de estas clases anotadas, convirtiéndolas efectivamente en beans que el contexto de Spring gestiona durante todo el ciclo de vida de la aplicación.
A medida que se crean estos beans, el contenedor gestiona automáticamente sus dependencias mediante la Inyección de Dependencias. Este proceso permite que las clases reciban las dependencias necesarias sin necesidad de crearlas o localizarlas explícitamente, optimizando el proceso de desarrollo.
Inyección de Dependencias (DI)
Primero, el Contenedor de Spring agrega a su contexto los beans (clases) marcados con las anotaciones @Component, @Service, @Repository y @Configuration. Después de esto, proporciona estos beans a cualquier objeto que los solicite.
Ejemplo de la vida real
Imagina que estás desarrollando una tienda en línea. Tienes una clase OrderService que gestiona pedidos y una clase PaymentService que maneja pagos. En lugar de crear manualmente una instancia de PaymentService dentro de OrderService, puedes permitir que el Contenedor de Spring cree e inyecte PaymentService en OrderService.
OrderService.java
PaymentService.java
1234567891011121314@Service public class OrderService { private final PaymentService paymentService; public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
En la clase OrderService, se tendrá un campo paymentService que está inicializado con el tipo exacto que necesitamos (PaymentService). Observa que no hemos inicializado explícitamente este objeto, ¡Spring lo hizo por nosotros!
Si no hubiéramos anotado PaymentService con @Service, este bean no habría sido añadido al contexto de Spring, y habríamos encontrado un error indicando que Spring no pudo encontrar dicho bean.
@Autowired
También se puede utilizar la anotación @Autowired, la cual indica al contenedor de Spring que inyecte el objeto apropiado en el campo.
OrderService.java
123456789101112131415@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
En Spring, a partir de la versión 4.3, el uso de la anotación @Autowired ya no es obligatorio al inyectar dependencias mediante un constructor si la clase tiene solo un constructor. Spring determina automáticamente que este constructor debe utilizarse para la inyección de dependencias.
¿Cuáles son los diferentes tipos de Bean?
Imagina que tienes una única máquina de café en una cafetería. Cada vez que un cliente pide un café, el barista utiliza siempre la misma máquina de café para preparar cada taza. La máquina de café es siempre la misma, no se utiliza una nueva para cada pedido.
De manera similar, en Spring, cuando inyectas un bean desde el contexto de Spring, Spring te proporciona siempre la misma instancia de ese bean. Esto se conoce como el alcance singleton. Al igual que la máquina de café en la cafetería, Spring garantiza que siempre obtienes el mismo objeto en lugar de crear uno nuevo cada vez.
Singleton
Podemos establecer el tipo utilizando la anotación @Scope y especificar singleton en los atributos.
SingletonService.
12345@Service @Scope("singleton") public class SingletonService { // Class for handling business logic }
Prototipo
PrototypeService.java
12345@Service @Scope("prototype") public class PrototypeService { // Class for handling business logic }
Realizamos la misma acción, pero especificamos prototype en los atributos. Esto garantiza que cada vez que inyectemos este bean, se devolverá un nuevo objeto.
Resumen
En este capítulo sobre IoC (Inversión de Control) y DI (Inyección de Dependencias), exploramos cómo Spring gestiona la creación y el ciclo de vida de los beans a través de su contenedor, permitiendo la inyección automática de dependencias.
Se discutió el alcance predeterminado singleton, donde se reutiliza una única instancia de un bean, y el alcance prototype, que crea una nueva instancia para cada solicitud, destacando cómo estos alcances afectan la gestión de objetos y el diseño de la aplicación.
1. ¿Qué es la Inversion of Control (IoC) en Spring?
2. ¿Qué principio subyace a la Dependency Injection (DI)?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 3.45
IoC y DI
Desliza para mostrar el menú
El Contenedor de Spring es el componente central del Spring Framework que gestiona la creación, configuración y ciclo de vida de los beans (objetos) dentro de una aplicación. El Contenedor de Spring también se conoce como el contenedor IoC.
Una dependencia se refiere a cualquier clase que requiere que se le inyecten otros objetos para funcionar correctamente, y esta cadena de dependencias puede continuar indefinidamente. Normalmente, para crear un objeto con dependencias, debemos inicializarlo explícitamente usando el operador new y especificar la clase.
Pero ahí es donde entra Spring con Inversion of Control y Dependency Injection. La idea es que Spring asume la responsabilidad de crear y gestionar las dependencias. En lugar de gestionar manualmente la configuración, simplemente anotamos las clases necesarias y Spring las crea automáticamente y administra su ciclo de vida dentro de su contexto.
Una de estas anotaciones es @Component, que colocamos encima de la clase.
BeanExample.java
123@Component public class BeanExample { }
Este enfoque desvía la atención de la gestión manual de dependencias, permitiendo a los desarrolladores concentrarse en la lógica de negocio mientras Spring se encarga de las tareas de infraestructura relacionadas con la creación de objetos y la gestión de dependencias.
¿Cómo funciona el contenedor de Spring?
Cuando la aplicación se inicia, se inicializa el Contenedor de Spring. Comienza escaneando las clases en busca de anotaciones como @Component, @Service, @Repository y @Configuration.
@Component es una anotación general que hace que una clase sea gestionada por Spring, permitiendo que se registre como un bean.
@Service, @Repository y @Controller son versiones más especializadas de @Component. Cumplen el mismo propósito pero indican el rol específico de la clase: @Service para la lógica de negocio, @Repository para el acceso a datos y @Controller para el manejo de solicitudes web.
@Configuration se utiliza para clases que contienen definiciones de beans y configuración de la aplicación.
Al marcar una clase con una de estas anotaciones, se asegura que se convierta en un bean dentro del contexto de Spring.
Una vez que se identifican las clases, el contenedor procede a crear instancias de estas clases anotadas, convirtiéndolas efectivamente en beans que el contexto de Spring gestiona durante todo el ciclo de vida de la aplicación.
A medida que se crean estos beans, el contenedor gestiona automáticamente sus dependencias mediante la Inyección de Dependencias. Este proceso permite que las clases reciban las dependencias necesarias sin necesidad de crearlas o localizarlas explícitamente, optimizando el proceso de desarrollo.
Inyección de Dependencias (DI)
Primero, el Contenedor de Spring agrega a su contexto los beans (clases) marcados con las anotaciones @Component, @Service, @Repository y @Configuration. Después de esto, proporciona estos beans a cualquier objeto que los solicite.
Ejemplo de la vida real
Imagina que estás desarrollando una tienda en línea. Tienes una clase OrderService que gestiona pedidos y una clase PaymentService que maneja pagos. En lugar de crear manualmente una instancia de PaymentService dentro de OrderService, puedes permitir que el Contenedor de Spring cree e inyecte PaymentService en OrderService.
OrderService.java
PaymentService.java
1234567891011121314@Service public class OrderService { private final PaymentService paymentService; public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
En la clase OrderService, se tendrá un campo paymentService que está inicializado con el tipo exacto que necesitamos (PaymentService). Observa que no hemos inicializado explícitamente este objeto, ¡Spring lo hizo por nosotros!
Si no hubiéramos anotado PaymentService con @Service, este bean no habría sido añadido al contexto de Spring, y habríamos encontrado un error indicando que Spring no pudo encontrar dicho bean.
@Autowired
También se puede utilizar la anotación @Autowired, la cual indica al contenedor de Spring que inyecte el objeto apropiado en el campo.
OrderService.java
123456789101112131415@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
En Spring, a partir de la versión 4.3, el uso de la anotación @Autowired ya no es obligatorio al inyectar dependencias mediante un constructor si la clase tiene solo un constructor. Spring determina automáticamente que este constructor debe utilizarse para la inyección de dependencias.
¿Cuáles son los diferentes tipos de Bean?
Imagina que tienes una única máquina de café en una cafetería. Cada vez que un cliente pide un café, el barista utiliza siempre la misma máquina de café para preparar cada taza. La máquina de café es siempre la misma, no se utiliza una nueva para cada pedido.
De manera similar, en Spring, cuando inyectas un bean desde el contexto de Spring, Spring te proporciona siempre la misma instancia de ese bean. Esto se conoce como el alcance singleton. Al igual que la máquina de café en la cafetería, Spring garantiza que siempre obtienes el mismo objeto en lugar de crear uno nuevo cada vez.
Singleton
Podemos establecer el tipo utilizando la anotación @Scope y especificar singleton en los atributos.
SingletonService.
12345@Service @Scope("singleton") public class SingletonService { // Class for handling business logic }
Prototipo
PrototypeService.java
12345@Service @Scope("prototype") public class PrototypeService { // Class for handling business logic }
Realizamos la misma acción, pero especificamos prototype en los atributos. Esto garantiza que cada vez que inyectemos este bean, se devolverá un nuevo objeto.
Resumen
En este capítulo sobre IoC (Inversión de Control) y DI (Inyección de Dependencias), exploramos cómo Spring gestiona la creación y el ciclo de vida de los beans a través de su contenedor, permitiendo la inyección automática de dependencias.
Se discutió el alcance predeterminado singleton, donde se reutiliza una única instancia de un bean, y el alcance prototype, que crea una nueva instancia para cada solicitud, destacando cómo estos alcances afectan la gestión de objetos y el diseño de la aplicación.
1. ¿Qué es la Inversion of Control (IoC) en Spring?
2. ¿Qué principio subyace a la Dependency Injection (DI)?
¡Gracias por tus comentarios!