¿Cómo llamar a un método después de la inicialización del bean?

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

Como nota al margen, uso ConfigContextLoaderListener para cargar el contexto de la aplicación en la aplicación web. Y quiero, que si bean ‘A’ es instanciado, simplemente llama al método A () una vez.

¿Cómo puede hacerse esto bien?

Puedes usar algo como:

   

Esto llamará al método “init” cuando se crea una instancia del bean.

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

  • Mantiene el código desacoplado de Spring API (@PostConstruct está en javax. *)
  • Anota explícitamente su método init como algo que necesita ser llamado para inicializar el bean
  • No necesita recordar agregar el atributo init-method a su definición de spring bean, spring llamará automáticamente al método (suponiendo que registre la opción anotación-config en algún otro lugar del contexto, de todos modos).

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

Use el atributo init-method

Pros:

  • No requiere Bean para implementar una interfaz.

Contras:

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

Implementar InitializingBean

Pros:

  • No es necesario especificar el método init o activar el procesamiento de análisis / anotación de componentes.
  • Apropiado para beans suministrados con una biblioteca, donde no queremos que la aplicación que utiliza esta biblioteca se preocupe por el ciclo de vida de bean.

Contras:

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

Utilice la anotación JSR-250 @PostConstruct lifecyle

Pros:

  • Útil cuando se usa escaneo de componentes para autodetectar frijoles.
  • Deja en claro que se debe usar 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 está especificada centralmente en la configuración.
  • Debes recordar activar el proceso de anotación (que a veces puede olvidarse)

¿Has intentado implementar InitializingBean ? Suena exactamente lo que buscas.

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

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, puede usar la interfaz InitializingBean o la directiva “init-method” (mismo enlace).

Para aclarar 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 el uso (1) solo funciona en un contenedor de servlets, mientras que (2) funciona en cualquier entorno, incluso en aplicaciones de escritorio. Por lo tanto, si utiliza Spring en una aplicación independiente, deberá usar (2) para llevar a cabo la “invocación de este método después de la inicialización”.