Antes de leer este post, te recomiendo los anteriores para un mejor entendimiento:
- Contenedores e Inyección de Dependencias 01
- Contenedores e Inyección de Dependencias 02
- Contenedor Spring 01
- Contenedor Spring 02
- Contenedor Spring 03
- Inyectar Colecciones en Spring 04
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
.