Saltar al contenido principal

Principios, Patrones y la Inyección de Dependencias

Para comprender la arquitectura de Spring Framework, es necesario primero analizar cómo se diseña el software orientado a objetos de forma limpia y mantenible. Los desarrolladores a menudo confunden términos como principios, patrones y frameworks; sin embargo, existe una jerarquía conceptual muy clara entre ellos.

En este documento exploraremos qué es un principio de diseño, desglosaremos los principios SOLID, aprenderemos qué es un patrón de diseño y veremos cómo Spring conecta estos conceptos mediante la Inversión de Control (IoC) y el Principio de Inversión de Dependencias (DIP).


1. Principios de Diseño vs. Patrones de Diseño

Antes de escribir código, los arquitectos de software establecen reglas y directrices. Es fundamental diferenciar un Principio de un Patrón:

Explicación de la Jerarquía

  • Principio de Diseño: Es una norma o directriz de alto nivel. Indica qué cualidad debemos buscar en el software (por ejemplo, "las clases deben estar desacopladas"), pero no dice cómo programarlo. No depende de ningún lenguaje de programación.
  • Patrón de Diseño: Es un esquema de solución probado para un problema recurrente de programación orientada a objetos. Indica cómo estructurar las clases para cumplir con uno o varios principios. Ejemplos: Factory, Singleton, Strategy.
  • Framework: Es la herramienta de software concreta (como Spring) que implementa dichos patrones internamente para evitarnos escribir código repetitivo.

2. Los Principios SOLID

Los principios SOLID son un conjunto de cinco directrices creadas por Robert C. Martin ("Uncle Bob") para lograr software fácil de mantener, extender y probar.

SiglaPrincipio en InglésNombre en EspañolDescripción Breve
SSingle Responsibility Principle (SRP)Principio de Responsabilidad ÚnicaUna clase debe tener una sola razón para cambiar; solo debe cumplir una función específica.
OOpen/Closed Principle (OCP)Principio de Abierto/CerradoLas entidades deben estar abiertas para extensión, pero cerradas para modificación.
LLiskov Substitution Principle (LSP)Principio de Sustitución de LiskovLos objetos de una subclase deben poder reemplazar a los de la superclase sin alterar el comportamiento correcto del programa.
IInterface Segregation Principle (ISP)Principio de Segregación de InterfacesEs mejor tener varias interfaces específicas que una sola interfaz sobrecargada de métodos no utilizados.
DDependency Inversion Principle (DIP)Principio de Inversión de DependenciasLos módulos de alto nivel no deben depender de módulos de bajo nivel; ambos deben depender de abstracciones.

3. Dos Principios Clave en Spring: DIP e IoC

Spring se sustenta en la combinación de dos principios fundamentales:

A. Dependency Inversion Principle (DIP)

El principio de Inversión de Dependencias establece dos reglas principales:

  1. Las clases de alto nivel (lógica de negocio) no deben depender directamente de las clases de bajo nivel (detalles técnicos como envío de correos, conexión a base de datos, etc.). Ambos deben depender de interfaces (abstracciones).
  2. Las abstracciones no deben depender de los detalles; los detalles deben depender de las abstracciones.

Esquema Conceptual: Con vs. Sin DIP

B. Inversion of Control (IoC)

Tradicionalmente, el programador escribe código que controla el flujo de la aplicación: decide cuándo instanciar objetos con new, cuándo llamar a un método y cuándo liberar memoria.

En la Inversión de Control (IoC), el control de la creación y gestión de los objetos se delega a un ente externo: el Contenedor IoC de Spring. El programador pasa de ser el "constructor que ensambla las piezas" a ser un "declarador de reglas" (mediante archivos XML u otros tipos de configuraciones).

Esquema Abstracto: La Analogía de la Fábrica de Automóviles


4. El Patrón Inyección de Dependencias (DI)

Mientras que IoC y DIP son principios de diseño (filosofía), la Inyección de Dependencias (DI) es el patrón de diseño concreto que los hace realidad.

La Inyección de Dependencias consiste en que un objeto no crea sus dependencias, sino que estas le son suministradas (inyectadas) desde el exterior en el momento de su instanciación.

Tipos de Inyección de Dependencias mediante XML

En Spring, utilizando archivos de configuración XML, disponemos de dos formas principales para inyectar dependencias:

1. Inyección por Constructor (<constructor-arg>)

Las dependencias necesarias se pasan como argumentos al constructor de la clase. Es el enfoque ideal para dependencias obligatorias.

2. Inyección por Setter (<property>)

El contenedor crea el objeto utilizando su constructor por defecto (sin argumentos) y luego invoca los métodos set...() para asignar cada dependencia. Es adecuado para dependencias opcionales o reconfigurables.


Cuestionario de Autoevaluación

Cargando cuestionario...