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

时间:2009-06-05 19:42:11

标签: java spring

我们有以下传统的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()实例将被完全初始化(但它是not null并且不抛出任何异常)。

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

1 个答案:

答案 0 :(得分:1)

首先,我建议打开日志并查看发生了什么。春天通常很有用。

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

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

首先,您可能希望 - 仅仅为了参数 - 尝试使用Spring 2.5.6运行应用程序。如果它有效,你就知道有罪的一方。