2009-06-05 19 views
5

tenemos el siguiente código de legado 2.0.7 primavera:Q sobre AbstractApplicationContext.getBeansOfType() y getBean()

final Map<String, MyClass> secondaryFactories 
    = (Map<String, MyClass>) context.getBeansOfType(MyClass.class, 
                false, true); 

return (MyClass) context.getBean("myClass"); 

donde context es una instancia de

org.springframework.context.support.AbstractApplicationContext 

Tenga en cuenta que ignoramos la valor de retorno de getBeansOfType(). Esto funciona bien, pero el problema es que la llamada al getBeansOfType() lleva mucho tiempo. Sin embargo, aunque ignoramos el valor de retorno de esta llamada, si tratamos de eliminar esta llamada, entonces la instancia de MyClass devuelta por getBean() no se ha inicializado por completo. (Así que, al parecer, la llamada a getBeansOfType() está teniendo algún tipo de efectos secundarios que necesitamos.)

sospechamos que la llamada a getBeansOfType() es una exageración y que se podía hacer algo más ligero para que la instancia de MyClass obtiene la llamada a getBean() se habrá inicializado por completo (pero no es nula y no se lanza ninguna excepción).

Entonces, ¿hay una manera más eficiente de hacer esto?

+0

¿Qué es BeanType.MY_CLASS.getName()? –

+0

¿Qué versión de Spring estás usando? Me parece un error. –

Respuesta

1

Antes que nada, sugiero activar el registro y ver qué sucede. La primavera suele ser bastante útil.

En segundo lugar, una diferencia entre context.getBeansOfType y context.getBean es que getBeansOfType no consulta el contexto primario. Si tiene uno, puede marcar una diferencia aquí.

En tercer lugar, supongo que el bean 'controlador' se inicializa con pereza. ¿Tiene algún tipo de código multiproceso ejecutándose mientras se inicializa el contexto? Ha habido reports de arreglos tarde en el ciclo 2.5 relacionados con eso. getBeansOfType podría estar generando un retraso o golpeando una barrera de memoria para que se oculte el problema con getBean devolviendo un grano no inicializado.

En cuarto lugar, es posible que desee, solo por razones de discusión, intente ejecutar la aplicación con Spring 2.5.6. Si funciona, conoces a la parte culpable.

+0

+1 para habilitar el registro de nivel de depuración, la primavera es muy detallada en ese nivel – skaffman

Cuestiones relacionadas