我们具有以下旧版2.0.7 Spring代码:

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

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

其中context是的实例
org.springframework.context.support.AbstractApplicationContext

请注意,我们忽略了getBeansOfType()的返回值。这很好用,但是问题是对getBeansOfType()的调用很耗时。但是,即使我们忽略此调用的返回值,但是如果我们尝试消除此调用,那么MyClass返回的getBean()实例也不会完全初始化。 (因此,显然,对getBeansOfType()的调用具有我们所需的某种副作用。)

我们怀疑对getBeansOfType()的调用是过大的,我们可以做些更轻巧的操作,以便通过对MyClass的调用获得的getBean()实例将被完全初始化(但它不为null且不会引发异常)。

那么,有没有更有效的方法呢?

最佳答案

首先,我建议打开日志记录,然后看看会发生什么。 Spring 通常是很有帮助的。

第二,context.getBeansOfTypecontext.getBean之间的区别是getBeansOfType不查询父上下文。如果您有一个,那么这里可能会有所不同。

第三,我假设“驱动程序” bean是延迟初始化的。初始化上下文时,您是否正在运行任何类型的多线程代码?在与此相关的2.5周期后期,已修复了reportsgetBeansOfType可能只是产生延迟或达到内存障碍,因此getBean返回未初始化的bean的问题被隐藏了。

第四,出于参数的考虑,您可能希望尝试使用Spring 2.5.6运行该应用程序。如果可行,您知道有罪的一方。

09-04 20:25