Antes de leer este post, te recomiendo los anteriores para un mejor entendimiento:

Ciclo de Vida

No solo en Spring, también en otras tecnologías como Java EE nos vamos a encotrar con este concepto. Para resumir es el nacimiento, vida y muerte de tus objetos en el contendor. Esto es cuando el contenedor arranca, crea los objetos, luego tu los usas y por último al detener el contenedor este destruye tus objetos.

Existen situaciones en que necesitamos trabajar sobre ese ciclo de vida, por ejemplo si tenemos un bean de acceso a base de datos podemos instanciar nuestras conexiones al momento de que se crea el bean y luego al detener el contenedor podemos liberar recursos. Usando métodos e indicandole a Spring cuales son para que los ejecute justo al cerar el bean y al destruirlo.

Aquí tenemos una clase con un método para inicializar cosas y otro para destruiro y liberar recursos.

Para Inicialización

1
2
3
4
5
public class ExampleBean {
  public void init() {
      // Código de inicialización
  }
}
1
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>


Para Destrucción

1
2
3
4
5
public class ExampleBean {
  public void cleanup() {
      // Código de finzalizacion, ej: liberar recursos
  }
}
1
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>


Nota que en la declaración del bean en el XML especificamos los métodos con init-method y destroy-method. También podemos usar unas interfaces de Spring aunque esta forma es mas intrusiva porque la usamos directamente en la clase.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.springframework.beans.factory.InitializingBean;

public class AnotherExampleBean implements InitializingBean {
  public void afterPropertiesSet() {
      // Código de inicialización
  }
}


import org.springframework.beans.factory.DisposableBean;

public class AnotherExampleBean implements DisposableBean {
  public void destroy() {
      // Código de finzalizacion, ej: liberar recursos
  }
}
1
2
3
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>

<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>

En este caso no usamos los atributos init-method y destroy-method si no las interfaces InitializingBean y DisposableBean.


Ciclo de Vida Global

Podemos especificar una configuración global para todos los beans y asi no indicar en cada bean cual es el método de inicialización y destrucción. Esto nos obliga a estandarizar los métodos en cada bean. En el tag <beans> del XML usamos los atributos default-destroy-method y default-init-method:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
 default-destroy-method="finish" default-init-method="init">

   <bean ... />

   <bean ... />

</beans>


En este caso si queremos usar el ciclo de vida de un bean este debe definir los métodos finish y init.


Franky Villadiego

Volando hacia el desarrollo productivo!