Sha*_*shi 6 java performance spring
我的同行总是强迫我使用Spring来创建任何对象的新实例.根据我的理解,Spring提供了一个更有效地管理Business对象的平台.Spring使架构更加模块化,更灵活.
在某些情况下,我觉得不使用spring bean,并寻找创建新对象的一般方法.但是,我的同行总是通过提供性能改进的借口来做到这一点.我从来没有找到任何与弹簧相关的文章,其中提到了性能因素.
问题:如果我使用spring bean创建对象,与使用"new"运算符创建新实例相比,它是否会提高性能.
Rod*_*ati 18
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构建的应用程序更容易测试的是基于精心设计的面向对象架构的应用程序.
如果您理性地思考,春季如何才能更快?它包装了您的代码。它还会通过适用的默认构造函数/重载构造函数。
例如导入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;
}
Run Code Online (Sandbox Code Playgroud)
}
Bean配置:
<!-- Fixed Account -->
<bean id="FixedAccount" class="demo.dependency.injection.impl.FixedAccount">
</bean>
Run Code Online (Sandbox Code Playgroud)
当您使用应用程序上下文加载Bean时,它将打印
ApplicationContext context = new FileSystemXmlApplicationContext("/Beans/SpringDemo.xml");
Account myAccount = (Account)context.getBean("FixedAccount");
Default constructor invoked!!
Run Code Online (Sandbox Code Playgroud)
但是,这里我们需要了解性能以外的其他优点。喜欢-DI-可管理性
因此,我认为性能原因是不合理的。
除此之外:Spring IOC框架提供了使用spring bean配置创建实例的方法。但是,这不会阻止您使用new运算符创建实例。
我想举一个例子,您可以选择使用new而不是spring bean。
可以说,在Web应用程序中,您具有单例bean,该bean具有用于业务逻辑的不同方法,并且在每个操作中,您可能需要用于操作的新对象实例(方法级别变量是线程安全的)。
因为如果单例bean具有原型bean,则在单例bean被调用时将仅被调用一次。请仔细阅读以全面了解。
http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html
我认为唯一的性能影响(可能是轻微还是严重)是在启动时对 Spring 的应用程序上下文的初始解释可能会减慢它的速度。但在那之后,由于 Spring 拥有其所有元数据,现在在标准情况下应该是可衡量的开销。
因此,如果您在桌面上通常对启动性能也很重要,则可能会影响大型复杂应用程序中的感知性能。对于服务器端应用程序,它通常可以忽略,因为启动并不重要,更重要的是应用程序在负载下的行为方式。
Spring 和非 Spring 之间唯一的其他区别是对默认内存消耗的部分影响,因为 Spring 需要在内存中创建和缓存元数据和 AOP 内容。
| 归档时间: |
|
| 查看次数: |
10268 次 |
| 最近记录: |