Java 关于AbstractApplicationContext.getBeansOfType()和getBean()的问题
我们有以下遗留的2.0.7 Spring代码: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
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