【发布时间】:2019-02-25 15:24:45
【问题描述】:
代码有两种变体:
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,只是简单的类)? 自动装配和 getBean 一样吗?
附:我想我应该稍微扩展一下我的问题。情况是我加入的团队只通过getBean(className)在项目中使用Spring注入。我猜的原因是大多数已经编写的项目类都不是 Spring bean,并且在一个类中使用自动装配意味着通常也会使依赖类 bean 等等,直到大多数类变成 bean...
好的,我想我理解这种方法的可测试性惩罚和整体缺乏代码风格。但是难道没有性能惩罚吗?在启动时构建的即用型 Spring 单例的性能是否存在差异,它的所有字段都是自动装配的,并且从非 Spring 非- 单例类(特别是在关键地方)?
附言我创建了类似 mini-benchmark 的东西(我知道由于 GC、JIT 等的工作,很难获得真实的信息,但尽管如此......)。 我的结果是(数字越大 - 越差): 自动装配时间 - 193,GetBean 时间 - 2161,同一个类中的方法 - 173,另一个类中的静态方法 - 206
【问题讨论】:
-
始终使用第二种方式进行可读性和测试。同样,只有在没有找到 bean 时调用
myMethod时,第一种方法才会失败,而第二种方法甚至不会让您的应用程序正常启动 -
另外,你不应该真正关心 spring 的性能,因为它本身已经有相当大的开销,并且可能不会用于性能关键的应用程序
-
IMO,您不应该真正关心启动时应用程序的性能。您使用 autowired 是因为它更方便;如果您关心启动时间,那么您可以完全避免使用 Spring,但缺点是您需要手动完成所有操作。
-
我不认为'使用弹簧'相对于'你不应该真正关心性能'。这个问题基于使用spring,
getBean和@autowired之间的性能。我认为有两个概念“依赖查找”和“依赖注入”。 getBean 是依赖查找。 @autowired 是依赖注入。这个问题很好。
标签: java spring performance autowired