My Peers总是强迫我使用Spring创建任何对象的新实例。根据我的理解,Spring提供了一个更有效地管理Business对象的平台。 Spring使架构更加模块化,更加灵活。
在某些情况下,我觉得不要使用spring bean,而是去创建新对象的一般方法。但是,我的同行总是通过提供性能改进的借口来做到这一点。我从来没有找到任何与弹簧相关的文章,其中提到了性能因素。
问题: 如果我使用spring bean来创建对象,那么与使用“new”运算符创建新实例相比,它是否会提高性能。
答案 0 :(得分:16)
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 make testing easy”的主张。在大多数情况下都是如此 - 大多数情况都是设计不佳的应用程序的一部分。唯一比基于Spring构建的应用程序更容易测试的是基于精心设计的面向对象架构的应用程序。
答案 1 :(得分:4)
我认为唯一的性能命中(它可能是次要的还是主要的)将是在启动时,Spring 的应用程序上下文的初始解释可以减慢它下。但是之后,因为Spring手头的所有元数据都应该是标准情况下可测量的开销。
因此,如果您在桌面上通常也会启动性能问题,那么它可能会影响大型复杂应用程序中的感知性能。对于服务器端应用程序,它几乎可以忽略,因为启动并不重要,而且应用程序在负载下的行为更为重要。
Spring和非Spring之间唯一的另一个区别是对默认内存消耗的部分影响,因为Spring需要在内存中创建和缓存元数据和AOP内容。
答案 2 :(得分:4)
如果你理性思考,春天怎么会更快?它是你的代码的包装。它还经历了适用的默认构造函数/重载构造函数。
e.g。 import demo.dependency.injection.IAccount;
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;
}
}
Bean配置:
<!-- 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,它具有不同的业务逻辑方法,并且在每个操作中您可能需要新的对象实例进行操作(方法级变量是线程安全的)。
因为如果singleton bean有原型bean,那么当调用singleton bean时它只会被调用一次。请完整了解这一点。
http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html
答案 3 :(得分:3)
Spring框架不是为了提高创建bean的性能,而是为了使应用程序松散耦合。它使用依赖注入和控制反转来实现它。
以下是一些文章,告诉您 spring 可以做什么?
如果我使用spring bean创建对象,与使用“new”运算符创建新实例相比,它是否会提高性能。
通常不,它不会。即使spring需要构造函数或反射来创建bean。因为默认情况下,spring bean是单例,因此它们只能创建一次。所以第二次访问它可能会更快。但请确保您不仅仅使用弹簧。
答案 4 :(得分:2)
使用spring时,创建应用程序时不会想到原始性能。随着代码的增长,这是代码的可维护性。 因此,建议您使用Factory方法实例化对象,因为它们将您与创建&amp;的负担分开。维护对象以执行业务代码。 IOC是春天的核心原则,可帮助您在没有参与的情况下创造物体。 对于最佳实践,您可以查看此blog post。
答案 5 :(得分:0)
使用Spring创建bean就是要很好地管理对象。你可以使用IOC(Inversion of Control)和AOP支持使用bean。
使用new或使用spring创建新对象是相同的。(我认为没有任何性能问题,但是使用spring会使其在以后更加有条理和灵活。)。
Spring还支持各种设计模式,如Singleton,factory-method等。