Español

Spring framework 5 : Uso de perfiles en Spring


Cuando trabajamos con Spring framework nos encontraremos con momentos en los que tenemos que activar o desactivar beans de acuerdo a ciertas circunstancias, por ejemplo diferentes ambientes utilizan diferentes bases de datos, diferentes países utilizan diferentes idiomas, etc.

Definición de servicios

Para mostrar el funcionamiento de los perfiles en Spring crearemos los siguientes servicios de spring de ejemplo:

/**
 * 
 * @author raidentrance
 *
 */
public interface EnvironmentService {

	String getEnvironmentName();

}
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

/**
 * @author raidentrance
 *
 */
@Service
@Profile("dev")
public class DevEnvironmentService implements EnvironmentService {
	
	@Override
	public String getEnvironmentName(){
		return "dev";
	}
	
}
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

/**
 * @author raidentrance
 *
 */
@Service
@Profile("qa")
public class QaEnvironmentService implements EnvironmentService {

	@Override
	public String getEnvironmentName() {
		return "qa";
	}

}

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

/**
 * @author raidentrance
 *
 */
@Service
@Profile("prod")
public class ProdEnvironmentService implements EnvironmentService{

	@Override
	public String getEnvironmentName() {
		return "prod";
	}

}

Como vemos tenemos una interfaz llamada EnvironmentService.java la cual cuenta con 3 implementaciones DevEnvironmentService.java, QaEnvironmentService.java y ProdEnvironmentService.java, estos servicios están anotados con @Profile indicando el perfil de acuerdo al cual se crearán.

Utilizando el Bean

Una vez que se definieron los beans el siguiente paso será utilizarlos, para esto utilizaremos el siguiente código:


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import com.devs4j.datasource.EnvironmentService;

@SpringBootApplication
public class SpringExampleApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringExampleApplication.class, args);
		EnvironmentService service = applicationContext.getBean(EnvironmentService.class);
		System.out.printf("Active environment %s \n", service.getEnvironmentName());
	}

}

Al ejecutar el código anterior tendremos la siguiente salida:

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.devs4j.datasource.EnvironmentService' available

Como vemos el error nos dice que no asignamos un qualifier al obtener la referencia de EnvironmentService, en lugar de hacerlo lo que haremos será definir un perfil de spring.

Definiendo el perfil

Como recordamos del primer post https://devs4j.com/2019/01/29/spring-framework-5-creando-un-proyecto-de-spring/ existe un archivo llamado application.properties, en el cual podremos definir el perfil bajo el cual se ejecutará nuestra aplicación, para hacerlo le agregaremos la siguiente línea:

application.properties

spring.profiles.active=dev

La línea anterior indica que el perfil que se activará será el perfil de desarrollo, una vez hecho esto ejecutaremos de nuevo nuestra aplicación y veremos lo siguiente:

2019-01-30 21:23:47.416  INFO 16798 --- [           main] com.devs4j.SpringExampleApplication      : Starting SpringExampleApplication on MacBook-Pro-de-Alejandro.local with PID 16798 (/Users/raidentrance/Documents/workspace-sts-3.8.3.RELEASE/spring-example/target/classes started by raidentrance in /Users/raidentrance/Documents/workspace-sts-3.8.3.RELEASE/spring-example)
2019-01-30 21:23:47.423  INFO 16798 --- [           main] com.devs4j.SpringExampleApplication      : The following profiles are active: dev
2019-01-30 21:23:48.158  INFO 16798 --- [           main] com.devs4j.SpringExampleApplication      : Started SpringExampleApplication in 1.253 seconds (JVM running for 1.641)
Active environment dev 

Como vemos el perfil se activó correctamente y al final nos imprime Active environment dev.

¿Qué pasa si inyecto el bean utilizando su implementación?

Como vimos activamos el perfil de dev y por esto al obtener una referencia de tipo EnvironmentService.java obtuvimos una de tipo DevEnvironmentService.java, pero, ¿Qué pasa si hacemos lo siguiente? :

ProdEnvironmentService prodService = applicationContext.getBean(ProdEnvironmentService.class);

Como vemos el perfil activo es dev, pero estamos tratando de obtener el bean del tipo ProdEnvironmentService.java. Al hacerlo nos podemos dar cuenta que obtendremos el siguiente error:

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.devs4j.datasource.ProdEnvironmentService' available

Esto es debido a que el bean no se creó por spring y no se agregó al contexto dado que no tiene el perfil indicado.

Para estar al pendiente sobre nuestro contenido nuevo síguenos en nuestras redes sociales  https://www.facebook.com/devs4j/ y https://twitter.com/devs4j.

Autor: Alejandro Agapito Bautista
Twitter: @raidentrance
Contacto:raidentrance@gmail.com

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s