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
ConfiguracionAppactúa como sustituto del archivo XML. - Las anotaciones
@Configurationy@ComponentScanson cruciales: la primera indica que la clase contiene definiciones de beans, y la segunda establece el paquete a escanear para componentes. - Si se usa
@Beanen 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,Personaya es un componente escaneado.