我们有以下传统的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并且不抛出任何异常)。
那么,有没有更有效的方法呢?
答案 0 :(得分:1)
首先,我建议打开日志并查看发生了什么。春天通常很有用。
其次,context.getBeansOfType
和context.getBean
之间的一个区别是getBeansOfType
不查询父上下文。如果你有一个,你可能会遇到一个不同。
第三,我假设'驱动'bean被懒惰地初始化了。在初始化上下文时是否运行任何类型的多线程代码?与此相关的2.5周期后期有reports次修复。 getBeansOfType
可能只是产生延迟或遇到内存障碍,因此隐藏了getBean
返回未初始化bean的问题。
首先,您可能希望 - 仅仅为了参数 - 尝试使用Spring 2.5.6运行应用程序。如果它有效,你就知道有罪的一方。