Configuración de Spring mediante JavaConfig

Configuración con Clases Java en Spring

Este artículo explica cómo reemplazar los archiovs de configuración XML con clases Java en el framework Spring. JavaConfig ofrece una alternativa basada en código que simplifica la configuración del contenedor de IoC.

Ejemplo Práctico

Supongamos un escenario con tres clases: un gato, un perro y una persona que depende de ambos animales.

Clase Gato

package com.example.spring.modelo;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")
public class Gato {
    public void emitirSonido() {
        System.out.println("miau~");
    }
}

Clase Perro

package com.example.spring.modelo;

import org.springframework.stereotype.Component;

@Component
public class Perro {
    public void emitirSonido() {
        System.out.println("guau~");
    }
}

Clase Persona

package com.example.spring.modelo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")
public class Persona {
    @Value("Carlos")
    private String nombreCompleto;

    @Autowired(required = false)
    private Gato mascotaFelina;
    
    @Autowired
    private Perro mascotaCanina;

    public String getNombreCompleto() {
        return nombreCompleto;
    }

    public void setNombreCompleto(String nombreCompleto) {
        this.nombreCompleto = nombreCompleto;
    }

    public Gato getMascotaFelina() {
        return mascotaFelina;
    }

    public void setMascotaFelina(Gato mascotaFelina) {
        this.mascotaFelina = mascotaFelina;
    }

    public Perro getMascotaCanina() {
        return mascotaCanina;
    }

    public void setMascotaCanina(Perro mascotaCanina) {
        this.mascotaCanina = mascotaCanina;
    }

    @Override
    public String toString() {
        return "Persona [nombreCompleto=" + nombreCompleto + ", mascotaFelina=" + mascotaFelina + ", mascotaCanina=" + mascotaCanina + "]";
    }
}

Clase de Configuración

package com.example.spring.configuracion;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.example.spring.modelo")
public class ConfiguracionApp {
    // Se podrían definir beans mediante métodos anotados con @Bean, pero no es necesario aquí.
}

Clase de Prueba

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.example.spring.configuracion.ConfiguracionApp;
import com.example.spring.modelo.Persona;

public class PruebaConfiguracion {
    @Test
    public void verificarConfiguracion() {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfiguracionApp.class);
        Persona individuo = ctx.getBean("persona", Persona.class);
        System.out.println(individuo.getNombreCompleto());
        individuo.getMascotaFelina().emitirSonido();
        individuo.getMascotaCanina().emitirSonido();
    }
}

Puntos Importantes

  • La configuración se realiza sin archivos XML, usando únicamente clases Java. La clase ConfiguracionApp actúa como sustituto del archivo XML.
  • Las anotaciones @Configuration y @ComponentScan son cruciales: la primera indica que la clase contiene definiciones de beans, y la segunda establece el paquete a escanear para componentes.
  • Si se usa @Bean en métodos de la clase de configuración, se pueden crear instancias de beans manualmente. Esto es útil para clases que no están anotadas con @Component, pero en este ejemplo, Persona ya es un componente escaneado.

Etiquetas: Spring JavaConfig configuration ComponentScan AnnotationConfigApplicationContext

Publicado el 6-29 00:43