Pregunta

Tengo un caso de uso donde tengo que llamar a un método (no estático) en el grano de sólo una vez en la carga hasta Application Context. ¿Está bien, si uso MethodInvokingFactoryBean para esto? O tenemos un poco de solución mejor?

Como nota al margen, yo uso ConfigContextLoaderListener para cargar el contexto de aplicación en aplicación web. Y la necesidad, de que si se crea una instancia de frijol 'A' sólo llamar MethodA () una vez.

¿Cómo se puede hacer esto bien?

¿Fue útil?

Solución

Puede usar algo como:

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

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

Otros consejos

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

  • Se mantiene el código desacoplado de la API de primavera (@PostConstruct está en javax. *)
  • Se anota explícitamente su método init como algo que tiene que ser llamado para inicializar el grano
  • No es necesario recordar que añadir el atributo-init método para la definición de frijol de primavera, primavera llamará automáticamente al método (suponiendo que se registre la opción de anotación-config en otro lugar en el contexto, de todos modos).

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

atributo Uso init-método

Pros:

  • No requiere frijol para implementar una interfaz.

Contras:

  • No hay indicación inmediata se requiere este método después de la construcción para asegurar el grano está configurado correctamente.

Implementar InitializingBean

Pros:

  • No hay necesidad de especificar init-método o activar el procesamiento de exploración / anotación componente.
  • apropiada para los granos suministrados con una biblioteca, donde no queremos que la aplicación que utiliza esta biblioteca para ocuparse de ciclo de vida del frijol.

Contras:

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

Utilice JSR-250 @ PostConstruct anotación de Ciclo de Vida

Pros:

  • útil cuando se utiliza la exploración componente autodetectar frijoles.
  • deja claro que un método específico se va a utilizar para la inicialización. Intención está más cerca del código.

Contras:

  • Inicialización ya no centralmente especificado en la configuración.
  • No debe olvidarse de activar el procesamiento de anotación (que a veces puede ser olvidado)

Ha intentado implementar InitializingBean ? Suena como exactamente lo que está buscando.

La desventaja es que el bean se convierte en primavera-consciente, pero en la mayoría de las aplicaciones que no es tan malo.

Se puede desplegar un encargo BeanPostProcessor en su contexto de aplicación para hacerlo. O si no te importa la implementación de una interfaz de primavera en el bean, se podría utilizar el initializingBean interfaz o la "directiva init-método"(el mismo enlace).

Para borrar aún más cualquier confusión acerca del uso es decir dos enfoque de

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

A partir de la experiencia personal, me di cuenta de que el uso de (1) sólo funciona en un contenedor de servlets, mientras que (2) que funciona en cualquier entorno, incluso en las aplicaciones de escritorio. Por lo tanto, si usted estaría utilizando la primavera en una aplicación independiente, que tendría que utilizar (2) para llevar a cabo esa "llama a este método después de la inicialización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top