Uso de @DependsOn con ejemplo en Spring

Uso de DependsOn en Spring

Uso de DependsOn 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.

Ciclo de vida de un Bean | Uso de @DependsOn con ejemplo en Spring
Ciclo de vida de un Bean

¿ 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!


Deja una respuesta

Tu dirección de correo electrónico no será publicada.