gpt4 book ai didi

java - 按类型接线的 Spring 比按名称接线慢

转载 作者:IT老高 更新时间:2023-10-28 13:47:46 26 4
gpt4 key购买 nike

在我的项目中,我正在尝试迁移

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票数很高,但由于某种原因没有得到解决。这导致我到 an attempt to solve this problem这确实显着改善了这种情况,但仍然比通过字符串查找慢 ~25 倍!事实证明,这种尝试只解决了一半的问题:它缓存了 bean 的名称以保存 O(n) 迭代,但仍然需要调用 isAssignableFrom验证类型。

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

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

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

最佳答案

这个问题现在在 Spring 中得到了解决,分辨率为 SPR-6870 .有关详细信息,请参阅那里的分辨率评论。该修复程序从 3.2.0.RELEASE 和 3.1.2 版本开始提供。

关于java - 按类型接线的 Spring 比按名称接线慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9429612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com