一尘不染

弹簧接线的类型比名称接线要慢一些

java

在我的项目中,我正在尝试迁移的所有用法

Foo foo = (Foo) beanFactory.getBean("name");

进入

Foo foo = beanFactory.getBean(Foo.class);

好处是显而易见的:类型安全,减少卷积代码,减少无用的常量等。通常,此类行位于静态旧有上下文中,在这种情况下,此类接线是唯一的选择。

一切都很好,直到有一天用户开始抱怨缓慢是由Spring内部产生的。因此,我启动了探查器以在

org.springframework.beans.factory.support.AbstractBeanFactory::doGetBean(String, Class<T>, Object[], boolean)

其中有一个昂贵的电话

Class.isAssignableFrom(anotherClass)

我迅速创建了一个小型性能测试,以找出字符串名称和类型查找之间的速度差异高达 350
倍(我正在StaticApplicationContext为此测试FAIW使用)!

在对此进行调查时,我发现SPR-6870的投票率很高,但由于某些原因未得到解决。这导致我尝试解决此问题该问题确实可以改善情况,但仍然比String查找慢 25
倍!事实证明,这种尝试只能解决一半的问题:它缓存要在O(n)迭代中保存的bean名称,但仍然必须进行调用isAssignableFrom以验证类型。

所描述的问题不仅与我的情况有关,而且还与所使用的bean有关,@Autowired并且在循环内创建bean的情况下很难感到困难。

解决方案之一是重写其中一个bean工厂方法并缓存is-this-of-same-same-
type检查结果,但是显然这应该在Spring中完成,而不是在我自己的代码中完成。

是否还有其他人遇到类似的问题并找到了解决方案?


阅读 140

收藏
2020-12-03

共1个答案

一尘不染

现在,在Spring中以SPR-6870的分辨率解决了此问题。有关详细信息,请参见此处的分辨率注释。该修补程序从3.2.0.RELEASE和3.1.2版本开始可用。

2020-12-03