¿Cómo llamar a un método después de que se haya completado la inicialización de bean?


Tengo un caso de uso en el que necesito llamar a un método (no estático) solo en bean, una vez en la carga ApplicationContext. ¿Está bien, si uso MethodInvokingFactoryBean para esto? ¿O tenemos una solución mejor?

Como nota al margen, uso ConfigContextLoaderListener para cargar el Contexto de la aplicación en la aplicación web. Y quiere, que si bean ' A ' es instanciado solo llame a methodA () una vez.

¿Cómo se puede hacer esto bien?

Author: BalusC, 2009-07-06

6 answers

Puedes usar algo como:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

Esto llamará al método "init" cuando se instancie el bean.

 191
Author: Mercer Traieste,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-12 09:38:01

Para ampliar la sugerencia @PostConstruct en otras respuestas, esta es realmente la mejor solución, en mi opinión.

  • Mantiene su código desacoplado de la API de Spring (@PostConstruct está en javax.*)
  • Explícitamente anota su método init como algo que necesita ser llamado para inicializar el bean
  • No es necesario que recuerde agregar el atributo init-method a su definición de spring bean, spring llamará automáticamente al método (suponiendo que registre opción de anotación-configuración en otro lugar del contexto, de todos modos).
 280
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-01 12:28:48

Hay tres enfoques diferentes a considerar, como se describe en la referencia

Utilice el atributo init-method

Ventajas:

  • No requiere que bean implemente una interfaz.

Contras:

  • No hay indicación inmediata este método es necesario después de la construcción para asegurar que el bean está configurado correctamente.

Implementar Inicializaciónbean

Ventajas:

  • No es necesario especificar el método init, o activar escaneo de componentes / procesamiento de anotaciones.
  • Apropiado para beans suministrado con una biblioteca, donde no queremos que la aplicación que usa esta biblioteca se preocupe por el ciclo de vida de bean.

Contras:

  • Más invasivo que el método init.

Use JSR-250 @PostConstruct anotación de ciclo de vida

Ventajas:

  • Útil cuando se utiliza el escaneo de componentes para detectar automáticamente beans.
  • Deja claro que un se utilizará un método específico para la inicialización. La intención está más cerca del código.

Contras:

  • La inicialización ya no se especifica de forma centralizada en la configuración.
  • Debe recordar activar el procesamiento de anotaciones (que a veces se puede olvidar)
 91
Author: toolkit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-19 10:24:33

¿Ha intentado implementar InitializingBean? Parece exactamente lo que buscas.

La desventaja es que su frijol se vuelve consciente de la primavera, pero en la mayoría de las aplicaciones no es tan malo.

 36
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-06 18:35:28

Puede implementar un BeanPostProcessor personalizado en el contexto de su aplicación para hacerlo. O si no le importa implementar una interfaz Spring en su bean, podría usar la interfaz InitializingBean o la directiva "init-method" (mismo enlace).

 8
Author: Rob H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-06 18:35:49

Para aclarar aún más cualquier confusión sobre los dos enfoques, es decir, el uso de

  1. @PostConstruct y
  2. init-method="init"

Por experiencia personal, me di cuenta de que usar (1) solo funciona en un contenedor servlet, mientras que (2) funciona en cualquier entorno, incluso en aplicaciones de escritorio. Por lo tanto, si utilizaría Spring en una aplicación independiente, tendría que usar (2) para llevar a cabo ese "llamar a este método después de la inicialización.

 -7
Author: Ayorinde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-24 10:25:18