gpt4 book ai didi

java - Spring @Autowire 与 getBean(className) 的性能比较

转载 作者:行者123 更新时间:2023-11-30 05:45:42 26 4
gpt4 key购买 nike

代码有两种变体:

public class MyClass {
public void myMethod() {
AnotherClass object = SpringContexHolder.getContext().getBean(AnotherClass.class);
object.doSomething();
}
}

@Component
public class MyClass {
@Autowired
AnotherClass object;

public void myMethod() {
object.doSomething();
}
}

第一个变体会有任何性能损失吗(顺便说一句,它不是 spring bean,只是简单的类)? Autowiring 与 getBean 的作用相同吗?

附注我想我应该稍微扩展一下我的问题。情况是我加入的团队仅通过 getBean(className) 在项目中使用 Spring 注入(inject)。我猜的原因是,大多数已经编写的项目类都不是 Spring bean,并且在一个类中使用 Autowiring 意味着通常也会生成依赖类 bean,依此类推,直到大多数类成为 bean...

好吧,我想我理解可测试性的损失以及这种方法总体上缺乏代码风格。但不是也会有性能损失吗?在启动时构建的准备就绪的 Spring 单例的性能之间没有区别,所有字段都自动连接,并且从非 spring 非调用 getBean(classname) (据我所知,比纯 hashmap.get(object) 慢几倍) -单例类(特别是在关键地方)?

附注我创建了类似迷你基准的东西(我知道由于 GC、JIT 等工作而很难获得真实信息,但尽管如此......)。我的结果是(数字越大 - 越差): Autowiring 时间 - 193,GetBean 时间 - 2161,同一个类中的方法 - 173,另一个类中的静态方法 - 206

最佳答案

每次需要访问 bean 时,都在 Spring 上下文(通常是复合上下文)中查找 bean 的效率很低。您实际上是在多个哈希表中多次查找某个项目,从而破坏 CPU 缓存、浪费时间,并且由于更复杂的执行路径而可能阻止内联等其他优化。

一定要使用 Autowiring (基于注释或基于构造函数)。这样,在应用程序启动时就会完成一次查找,然后通过直接引用访问该类。

即使使用@Autowired注释,可测试性也非常好。您只需 Autowiring 模拟而不是实际对象。另请查看 MockitoSpring-Test注释来注入(inject)模拟并以其他方式增强 Spring 上下文以用于测试目的。

关于java - Spring @Autowire 与 getBean(className) 的性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54869486/

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