Tengo un caso de uso donde necesito llamar a un método (no estático) en el bean solo una vez en la carga de 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 quiero, que si se crea una instancia del bean 'A' solo llame al método A () una vez.
¿Cómo se puede hacer esto bien?
Para ampliar la sugerencia de @PostConstruct en otras respuestas, esta es realmente la mejor solución, en mi opinión.
fuente
<context:component-scan>
también funciona y puede ser útil para reducir el tiempo de inicio si tiene grandes bibliotecas que no sean Spring en su classpath.Hay tres enfoques diferentes a considerar, como se describe en la referencia
Utilice el atributo init-method
Pros:
Contras:
Implementar InitializingBean
Pros:
Contras:
Utilice la anotación de ciclo de vida JSR-250 @PostConstruct
Pros:
Contras:
fuente
@PostConstruct
precisamente porque es parte de la clase que necesita que el método llame al final del proceso de inicialización.¿Has intentado implementar
InitializingBean
? Parece 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.
fuente
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).
fuente
Para aclarar aún más cualquier confusión sobre los dos enfoques, es decir, el uso de
@PostConstruct
yinit-method="init"
Por experiencia personal, me di cuenta de que usar (1) solo funciona en un contenedor de servlets, mientras que (2) funciona en cualquier entorno, incluso en aplicaciones de escritorio. Entonces, si usaría Spring en una aplicación independiente, tendría que usar (2) para llevar a cabo esa llamada a este método después de la inicialización.
fuente
@PostConstruct
(cuando se usa en una aplicación basada en Spring) está vinculada a la vida útil del contexto Spring propio. Tales contextos se pueden usar en todo tipo de aplicaciones.