Uso de @DependsOn con ejemplo en Spring
En esta entrada vamos a ver el uso de @DependsOn con ejemplo en Spring vamos a ver como podemos gestionar el orden en el que se instancian nuestros beans. Para poder controlar el orden de creación de nuestros Beans nos vamos a basar en la anotación @DependsOn.
Ciclo de vida de un Bean en Spring
Vamos a ver cómo es el ciclo de vida de un Bean, es decir, desde que se crea, su comportamiento y el momento de su destrucción.
El ciclo de vida de un Bean es administrado por el contenedor de Spring. Al arrancar una aplicación se crea el contenedor y a continuación se crean los bean, los cuales estarán presentes hasta que son destruidos al cerrar el contenedor o la aplicación.
Esta dependencia se encuentra dentro del contexto de Spring por lo que si haces uso de Spring Boot no se tendría que añadir ninguna librería.
¿ Cuándo usar @DependsOn en Spring?
Para poder controlar el uso de un Bean de Spring, necesitamos hacer uso de @DependsOn. Esta anotación nos garantiza que nuestro Bean definido depende de que algún otro se instancie primero.
El uso de DependsOn en nuestras aplicaciones va a crear una dependencia entre los beans, alterando el flujo de vida de su creación.
La anotación @DependsOn puede ser usada a nivel de clase o a nivel de método.
Imagina que queremos crear 3 beans, llamados bean1, bean2 y bean3, y la creación del bean1 depende que existan previamente el 2 y el 3. Es para este tipo de casos cuando usaremos @DependsOn.
Ejemplo de Uso de @DependsOn en Spring
A continuación vamos a ver como realizar un ejemplo con @DependsOn. Esta anotación viene incluida en la dependencia context de spring por lo que sino estas usando Spring Boot, tendrás que añadirla como una dependencia maven o gradle.
Depenencia Maven para hacer uso de @DependsOn en Spring
Esta dependencia es necesaria para el caso en el que no usemos Spring Boot.
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${version}</version> </dependency>
Creación de Beans para hacer uso de @DependsOn
Vamos a comenzar creando los Beans que dependeran de uno de otro sucesivamente:
@Slf4j public class FirstBean { @Autowired private SecondBean secondBean; @Autowired private ThirdBean thirdBean; public FirstBean() { log.info("FirstBean Initialized"); } public void populateBeans() { secondBean.display(); thirdBean.display(); } }
@Slf4j public class SecondBean { public SecondBean() { log.info("SecondBean Initialized"); } public void display() { log.info("Bean called"); } }
@Slf4j public class ThirdBean { public ThirdBean() { log.info("ThirdBean Initialized"); } public void display() { log.info("ThirdBean has been called"); } }
Uso de @DependsOn en Spring
Una vez tenemos configurado nuestras clases de Beans vamos a crear nuestra clase de configuración en donde creamos nuestros beans. En esta clase vamos a hacer que la creación de nuestro FirstBean dependa de la creación de los otros dos:
@Configuration public class AppConfig { @Bean("firstBean") @DependsOn(value = { "secondBean", "thirdBean" }) public FirstBean firstBean() { return new FirstBean(); } @Bean("secondBean") public SecondBean secondBean() { return new SecondBean(); } @Bean("thirdBean") public ThirdBean thirdBean() { return new ThirdBean(); } }
Conclusión
El uso de @DependsOn en Spring nos va a facilitar el control de los beans y poder alterar la creación y su ciclo de vida. De manera que nos facilitará la inyección de dependencias y su gestión en nuestras aplicaciones.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!