Contenedores de Inyección de Dependencias para Java: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Contenedor de Inyección de Dependencias para Java: ¿qué es y para qué sirve?



En el desarrollo moderno de Java, uno de los principios clave de diseño es la Inyección de Dependencias (DI) — un patrón en el que un objeto recibe sus dependencias desde el exterior, en lugar de crearlas él mismo. Para automatizar este proceso se utilizan los contenedores de Inyección de Dependencias — bibliotecas que gestionan el ciclo de vida de los objetos y sus relaciones.



Un contenedor DI (también llamado contenedor de Inversión de Control (IoC)) se encarga de la creación, configuración y vinculación de los componentes de la aplicación. Esto permite:



  • Reducir el acoplamiento del código (loose coupling)
  • Simplificar las pruebas (fácil sustitución de dependencias por objetos mock)
  • Aumentar la reutilización de componentes
  • Gestionar la configuración de forma centralizada


¿Cómo funciona un contenedor DI?



La tarea principal del contenedor es vincular interfaces con sus implementaciones. El proceso generalmente incluye tres etapas:



  1. Registro de dependencias — el contenedor conoce qué clases e interfaces están disponibles
  2. Resolución de dependencias — al crear un objeto, el contenedor analiza su constructor o campos
  3. Inyección — el contenedor crea instancias de las dependencias y las pasa al objeto destino


Consideremos un ejemplo simple sin contenedor:



public class UserService {    private UserRepository repository;

public UserService() { // Acoplamiento fuerte — creamos la dependencia manualmente this.repository = new UserRepositoryImpl(); }}


Usando un contenedor DI (con Spring como ejemplo):



@Servicepublic class UserService {    private final UserRepository repository;

// Inyección por constructor @Autowired public UserService(UserRepository repository) { this.repository = repository; }}


El contenedor creará automáticamente una instancia de UserRepositoryImpl y la pasará al constructor.



Contenedores DI populares para Java



En el mercado de Java existen varias soluciones maduras. Veamos las principales:



1. Spring Framework / Spring Boot

El contenedor DI más popular. Utiliza anotaciones (@Component, @Service, @Repository) o configuración XML. Soporta:

  • Escaneo automático de paquetes (component scanning)
  • Perfiles y dependencias condicionales
  • Gestión del ciclo de vida de los beans (singleton, prototype, etc.)
  • AOP (programación orientada a aspectos)


@Configurationpublic class AppConfig {    @Bean    public UserRepository userRepository() {        return new UserRepositoryImpl();    }

@Bean public UserService userService() { return new UserService(userRepository()); }}


2. Google Guice

Contenedor DI ligero y rápido de Google. Utiliza módulos y la anotación @Inject.

public class MyModule extends AbstractModule {    @Override    protected void configure() {        bind(UserRepository.class).to(UserRepositoryImpl.class);    }}

public class Main { public static void main(String[] args) { Injector injector = Guice.createInjector(new MyModule()); UserService service = injector.getInstance(UserService.class); }}


3. Dagger 2

Genera código en tiempo de compilación, lo que proporciona el máximo rendimiento. Se utiliza a menudo en el desarrollo de Android.

@Componentpublic interface AppComponent {    UserService getUserService();}

@Modulepublic class AppModule { @Provides UserRepository provideUserRepository() { return new UserRepositoryImpl(); }}

// UsoAppCompon

Recommendations