Spring BeanPostProcessor
En esta entrada vamos a intentar explicar qué es en Spring BeanPostProcessor, ya que muchas veces hacemos uso de ello sin saberlo. Es muy importante conocer este tipo de beans, no solo para saber utilizarlo, sino también por mejorar nuestros conocimientos sobre el ciclo de vida de Spring.
¿Qué es un BeanPostProcessor?
Antes de nada vamos a definir qué es un BeanPostProcessor. El bean post processor es responsable de procesar cada bean disponible con el contenedor IoC, extendiendo la funcionalidad del contenedor IoC y agrega lógica instanciación, de dependencias etc, . Si tienes dudas sobre cómo funciona la inyección de dependencias puedes echar un ojo aquí.
Básicamente un BeanPostProcessor es una interfaz que define dos métodos, postProcessBeforeInitialization()
y postProcessAfterInitialization().
Éstos dos métodos callback son llamados por el contenedor IoC antes y después de la instancición, configuración e inicialización de cada uno de los beans.
Algunas clases de Spring AOP (por ejemplo, AbstractAdvisingBeanPostProcessor) se implementan como postprocesadores de bean para proporcionar una lógica de ajuste de proxy.
Si se tienen multiples instancias de BeanPostProcessor, podemos controlar el orden de instanciación implementando la interfaz Ordered o estableciendo la propiedad Order.
Ejemplo de BeanPostProccessor
Vamos a verlo mejor con un ejemplo, el funcionamiento de BeanPostProcessor y como podemos hacer un seguimiento antes y después de la instanciación del bean.
public class HelloBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Llamada a beanPostProcessor antes del proceso de inicialización del bean: "+beanName + "class : "+bean.getClass()); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Llamada a beanPostProcessor después de la inicialización del bean: "+beanName + "class : "+bean.getClass()); return bean; } }
En este ejemplo hemos visto como a partir de la implementación de la interfaz de BeanPostProcessor, implementamos sus dos métodos con los que podemos seguir una cierta trazabilidad del bean que se crea.
En el caso en el que queramos registrar nuestro HelloBeanPostProcessor, tendremos que crear su bean, para ello podemos añadir @Component o registrarlo con @Bean. A continuación veremos otro ejemplo al cual añadimos @Component.
Ejemplo de BeanPostProcessor y Ordered
En este segundo ejemplo vamos a implementar además de BeanPostProcesor la interfaz Ordered, para ordenar su ejecución con respecto al resto de BeanPostProcessor .
@Component public class HelloBeanPostProcessor implements BeanPostProcessor, Ordered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Llamada a beanPostProcessor antes del proceso de inicialización del bean: "+beanName + "class : "+bean.getClass()); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Llamada a beanPostProcessor después de la inicialización del bean: "+beanName + "class : "+bean.getClass()); return bean; } @Override public int getOrder() { return Integer.MAX_VALUE; } }
Conclusión
En esta entrada hemos visto como funciona Spring BeanPostProcessor y cómo podemos usarlo, lo cual nos ayudará a entender un poco más el ciclo de vida de Spring y la creación de los beans.