Spring @Bean es una de las anotaciones que más se usa en Spring Framework . Normalmente nos sirve para configurar beans a medida. Es decir beans que necesitamos instanciar con alguna configuración por defecto . Normalmente cuando generamos Servicios o Repositorios estos no tienen grandes configuraciones que asociar ya que vienen dadas por el application.properties que es el fichero que configura todo por defecto a nivel de Spring Boot sin embargo hay ocasiones que algunos beans que puede ser necesario realizar una configuración a medida para luego usarlos en Servicios o Controllers como clases de apoyo. Vamos a verlo:
Spring @Bean
Lo primero que tendremos que hacer es generarnos ese Bean especial que queremos inicializar de forma personalizada.
El código del bean es :
package com.arquitecturajava.bean; public class GestorCarpeta { private String ruta; private String filtro; public String getRuta() { return ruta; } public void setRuta(String ruta) { this.ruta = ruta; } public String getFiltro() { return filtro; } public void setFiltro(String filtro) { this.filtro = filtro; } public GestorCarpeta(String ruta, String filtro) { super(); this.ruta = ruta; this.filtro = filtro; System.out.println("gestor creado"); } }
Una vez tenemos el bean definido es cuestión de ligarlo con Spring Boot a través de la inicialización usando Spring @bean.
package com.arquitecturajava.bean; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class BeanApplication { public static void main(String[] args) { SpringApplication.run(BeanApplication.class, args); } @Bean public GestorCarpeta crearHilo() { return new GestorCarpeta("micarpeta", "mifiltro"); } }
Como podemos ver el bean se configura con “micarpeta” y “mifiltro” dos de las propiedades que podemos considerar que el gestor carpeta gestiona. Una vez hecho esto podemos usar las capacidades de Spring de Inyección de dependencia para inyectar el gestor a cualquier Servicio o Controlador . En este caso para hacer las cosas sencillas podemos usar un Controller.
package com.arquitecturajava.bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HolaController { @Autowired GestorCarpeta gestor; @RequestMapping("/hola") public GestorCarpeta getGestor() { return gestor; } }
Ya solo nos queda por invocar el servicio desde una url de /hola
Tenemos configurado el @bean correctamente
Después de 10 años usando Spring sigo sin tener clara la diferencia entre @Bean y @conponent
hay un articulo ahora que habla de ello 🙂