Java 关于AbstractApplicationContext.getBeansOfType()和getBean()的问题

Java 关于AbstractApplicationContext.getBeansOfType()和getBean()的问题,java,spring,Java,Spring,我们有以下遗留的2.0.7 Spring代码: final Map<String, MyClass> secondaryFactories = (Map<String, MyClass>) context.getBeansOfType(MyClass.class, false, true); return (MyClass) context.getBea

我们有以下遗留的2.0.7 Spring代码:

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

return (MyClass) context.getBean("myClass");
请注意,我们忽略了
getBeansOfType()
的返回值。这很好,但问题是调用
getBeansOfType()
非常耗时。然而,即使我们忽略了这个调用的返回值,如果我们试图消除这个调用,那么由
getBean()
返回的
MyClass
实例也没有完全初始化。(显然,调用
getBeansOfType()
有一些我们需要的副作用。)

我们怀疑对
getBeansOfType()
的调用有些过分,我们可以做一些更轻量级的事情,以便通过调用
getBean()
获得的
MyClass
的实例将被完全初始化(但它不是null,也不会引发异常)


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

首先,我建议打开日志记录,看看会发生什么。春天通常很有帮助

其次,
context.getBeansOfType
context.getBean
之间的一个区别是
getBeansOfType
不查询父上下文。如果你有一个,你可能会遇到不同

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


第四,您可能希望(为了论证起见)尝试使用Spring2.5.6运行应用程序。如果它起作用,你就知道有罪的一方。

什么是BeanType.MY_CLASS.getName()?你使用的是哪个版本的Spring?对我来说,听起来像个bug。+1对于启用调试级别日志记录,spring在该级别非常详细
org.springframework.context.support.AbstractApplicationContext