7

我的同行总是强迫我使用 Spring 来创建任何对象的新实例。据我了解,Spring 提供了一个更有效地管理业务对象的平台。Spring 使架构更加模块化和更加灵活。

在某些情况下,我觉得不使用 spring bean,而是使用创建新对象的通用方法。但是,我的同龄人总是以提高绩效的借口来强迫这样做。我从来没有找到任何与弹簧相关的文章提到性能因素。

问题:如果我使用 spring bean 来创建对象,与使用“new”运算符创建新实例相比,它是否提高了性能。

4

6 回答 6

21

Spring 与任何其他工具一样是一种工具 - 如果应用得当,它会带来好处。当应用不当时,它只不过是纯粹的开销。

这恰好是我在 Spring 中经常看到的常见情况——项目要求一切都必须是 Spring Bean。当一个人试图做一些简单的事情时,这会导致大量的开发工件开销。

我发现在许多使用 Spring 的应用程序中遗漏的关键点是设计师/架构师普遍缺乏面向对象的经验或知识。他们对 Spring 很满意,因此一切都必须是 Spring。这种情况通常可以通过查看应用程序的整体类层次结构来识别(如果可以的话——我不知道任何理解 Spring bean 的 UML 工具)——你通常会发现几乎是扁平的继承层次结构——几乎没有类将从基类继承功能。这反过来意味着很少甚至没有封装。这反过来将表现为解决方案中的大量类。最后,在我看到的大多数情况下,以这种方式使用 Spring 的应用程序也存在性能问题 - 不是因为使用 Spring,但更多的是缺乏全面的设计。Spring 是一个框架,而不是架构。

Spring 唯一有意义的领域是那些可能经常更改或与执行环境相关的类——即测试与生产。除了这些区域之外,问题域(现实)中存在的类之间的关系也应该存在于代码中——这些不会改变,使它们成为 Spring bean 只会增加性能和开发工件方面的开销。

如果您的应用程序架构良好,并且在大多数情况下可能不是,那么任何库或框架都将始终由问题域中的类封装。这特别意味着库或框架不是应用程序级别的可见组件。这对于任何具有任何 OOA/OOD 意识的人来说都应该是显而易见的——你能想到商业世界中的一个问题域,它正式包括从外部配置类之间关系的能力。如果您回答“是”,那么您不了解 OOA/OOD,您将成为到处使用 Spring 的人之一。

这是一个试金石,可以让您查看是否过度使用或错误地使用 Spring - 从理论上讲,您是否可以在无需更改代码的情况下将 Spring 换成类似的东西?如果不是,那么您的设计很弱,并且正在使用 Spring 来支持它。如果您的应用程序的每个版本都会增加您的责任(增加您的工作量),这通常是可以识别的。

最后,有人会在这里附和“Spring 使测试变得容易”的说法。大多数情况下都是如此 - 大多数情况是设计不佳的应用程序的一部分。唯一比基于 Spring 构建的应用程序更容易测试的是构建在设计良好的面向对象架构上的应用程序。

于 2013-09-16T17:48:26.220 回答
6

如果你理性地思考,春天怎么会更快呢?它是您代码的包装器。它还通过适用的默认构造函数/重载构造函数。

例如导入demo.dependency.injection.IAAccount;

public class SavingAccount implements IAccount {
public static int SAVING_INT = 5;

public SavingAccount() {
    System.out.println("Default constructor invoked!!");
}

@Override
public int calculateInterest(int amount, int duration) {
    return (amount*duration*SAVING_INT)/100;
}

}

豆配置:

<!-- Fixed Account -->
<bean id="FixedAccount" class="demo.dependency.injection.impl.FixedAccount">
</bean>

当您使用应用程序上下文加载 bean 时,它将打印

ApplicationContext context = new FileSystemXmlApplicationContext("/Beans/SpringDemo.xml");
Account myAccount = (Account)context.getBean("FixedAccount");


Default constructor invoked!!

但是,在这里我们需要了解除了性能之外还有其他优势。像 - DI - 可管理性

所以我认为性能原因是不合理的。

除此之外:Spring IOC 框架提供了使用 spring bean 配置创建实例的方法。但是,它不会阻止您使用 new 运算符创建实例。

我想举一个例子,你可以选择使用new而不是spring bean

假设在您的 Web 应用程序中,您有单例 bean,它具有不同的业务逻辑方法,并且在每个操作中,您可能需要新的对象实例进行操作(方法级别变量是线程安全的)。

因为如果单例 bean 有原型 bean,那么它只会在单例 bean 被调用时被调用一次。请仔细阅读以获取完整的理解。

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html

于 2012-04-16T07:20:37.497 回答
5

我认为唯一的性能影响(它可能是多么轻微或主要)将是在启动时,Spring 应用程序上下文的初始解释可能会减慢它的速度。但在那之后,由于 Spring 手头拥有所有元数据,因此在标准情况下现在应该是可测量的开销。

因此,如果您在通常启动性能也很重要的桌面上,它可能会影响大型复杂应用程序中的感知性能。对于服务器端应用程序,它几乎可以忽略不计,因为启动并不重要,更重要的是应用程序在负载下的行为方式。

Spring 和非 Spring 之间唯一的其他区别是对默认内存消耗的部分影响,因为 Spring 需要在内存中创建和缓存元数据和 AOP 内容。

于 2012-04-16T07:18:15.683 回答
4

Spring 框架不是为了提高创建 bean 的性能,而是为了使应用程序松散耦合。它使用依赖注入和控制反转来实现它。

这里有一些文章告诉你spring可以做什么?

  1. http://www.wrox.com/WileyCDA/Section/Why-Use-the-Spring-Framework-.id-130098.html
  2. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/overview.html
  3. http://orangeslate.com/2006/11/10/five-advantages-of-spring-framework/

如果我使用 spring bean 来创建对象,与使用“new”运算符创建新实例相比,它是否会提高性能。

通常不,它不会。甚至 spring 也需要构造函数或反射来创建 bean。因为,默认情况下,spring bean 是单例的,所以它们只能被创建一次。所以第二次访问它可能会更快。但请确保您不只是为此使用弹簧。

于 2012-04-16T08:06:02.750 回答
2

在使用 spring 时,在创建应用程序时不会想到原始性能。这是代码在增长时的可维护性。因此,建议您使用工厂方法来实例化对象,因为它们将您从创建和维护对象以执行业务代码的负担中分离出来。 IOC是 spring 的核心原则,可以帮助您在没有您参与的情况下创建对象。有关最佳实践文章,您可以查看此博客文章

于 2012-04-16T07:13:18.580 回答
0

使用 Spring 创建 bean 就是为了很好地管理对象。您可以通过使用 bean 来使用 IOC(控制反转)和 AOP 支持。

使用 new 或使用 spring 创建新对象是相同的。(我认为没有任何性能问题,但使用 spring 使其在以后更有条理和灵活。)。

另外一件事 Spring 还支持各种设计模式,如 Singleton、factory-method 等。

于 2012-04-16T07:08:26.763 回答