it-swarm.cn

为什么不使用Spring框架?

将我的应用程序绑定到Spring框架有什么缺点吗?

我不是在谈论类似的bug或问题。我说的是会影响我的应用程序生命周期的战略性架构问题。

我应该更喜欢Spring而不是Java EE容器支持的EE核心功能吗?有什么优势?

43
Mykhaylo Adamovych

由于此处的其他帖子都提到了上行空间,因此我将提到Spring的负面方面。即使有这些负面影响,Spring的利基性,可靠性和广告宣传也无处不在。

因此,对底片:

  • 太好了:我不想将3000类的罐子放入我的小爱好项目中。

  • 有一些描述比其他一些DI框架(如Guice或Pico)要慢。轶事,也许不太重要。

  • 当Spring的某些部分没有充分记录的核心部分时,您会感到沮丧,并且您发现在多个主要版本中发现的文档确实有所不同。

作为其规模的副作用,请准备好花费欢乐的时光来挖掘一堆被逻辑命名的类,当您感到疲倦时,它们会开始合并成一堆巨大的名词(“当然,您只需将TransactionAwareConnectionFactoryProxy连接到您的UserCredentialsConnectionFactoryAdapter到您的.. zzzzzzzz“)。公平地讲,它们确实在逻辑上被命名,这是对框架大小的合理响应,但仍然如此。

可能是由于新作品的这种适应,至少对于我而言,春天可能会很慢。核心弹簧的功能不是很多,但是几乎所有功能都有连接器,而且它们的记录也不够完善,那就是您开始涉猎名词汤的时候了。同样,这实际上只是为了响应其大小。

42
Steve B.

Spring的缺点很少

为了找到使用Spring的任何严重缺点,我经过了漫长而艰难的思考,恐怕我失败了。在JEE/OSGi模型中,Spring是一个出色的工具包。它提供了广泛的非侵入性模板,极大地简化了由应用程序容器提供的通常繁琐的支持API的使用。

Spring与核心JEE

Spring并没有取代核心的JEE技术-也许是EJB,但是在新的EJB3规范中几乎没有任何内容-相反,它提供了使使用它们更加容易的模板。考虑JAX-RS为RESTful Web服务API。 Spring提供了RestTemplate,通常按如下方式使用(假定已注入):

SomeJaxbAnnotatedClass object = restTemplate.getForObject(someURI,SomeJaxbAnnotatedClass.class);

这将_someURI获取XML/JSON/YAML并将其解组到您指定的域对象中。全部在一行代码中。

异常和错误日志记录作为运行时异常进行处理,从而更易于保持本地代码的清洁。 Spring甚至竭尽所能减少外部依赖,因此上面的示例仅使用Java.net。*包。

有用于JMS,JAX-WS,JPA,JTA等的模板。所有这些使使用这些标准变得更容易很多,并使您的代码更整洁,更不易出错。

Pick'n'mix体系结构

从体系结构的角度来看,Spring强调了一种轻量级的Pick'n'mix方法。这样的效果是,系统架构师可以避免使用膨胀的所有人应用程序容器,例如WebSphere,JBoss或Glassfish,而可以选择轻量级的对等容器-Jetty,Tomcat等。

为什么这很重要?较大的应用程序容器具有更长的更新周期,这比其他客户端更能满足某些客户端的需求。银行不必像一人创业公司那样敏捷。

如果要使用最新版本的支持框架,则不太可能在大型应用程序容器中找到它们。取而代之的是,您需要手动添加它们,而Spring使此操作变得容易。

另外,您只需要专门包括所需的技术即可。应用程序容器将为您提供JMS,EJB和Sun下的其他首字母缩写词,但是您只想轻松持久地使用JPA。包括Spring和Hibernate,您就完成了。

那为什么不春天?

如果要使用特定于供应商的库实现,请避免使用Spring。另外,如果要在类中保留配置详细信息,而不是将其外部化为XML或JNDI,请避免使用它。如果您认为免费和开源解决方案不适合您的环境,则绝对不要这样做。

9
Gary Rowe

马丁·汤普森(Martin Thompson)在 本文 中提到的一件有趣的事情是,春天可以对GC时间产生不小的影响:

保持调用堆栈相当小。还有更多工作要做。如果您疯狂到足以使用Spring,那么请查看您的调用堆栈以了解我的意思!垃圾收集器必须引导他们找到可到达的对象。马丁·汤普森

对于大多数类型的应用程序来说,这种事情并不是什么大问题,但对于Martin所指的应用程序来说,这是一个非常现实的问题。

5
Paul Sanwald

春天真的很好。 Spring Core很好。我还要补充一点,如果您属于真正关注性能的细分领域,那么只有在顶级开发人员的手中,您才要避免使用其他Spring模块。仅当您正在运行对性能至关重要的系统时,才需要担心。在一般的优秀开发人员手中,Spring可能实际上可以通过帮助编写简洁的代码来提高性能。

3
jasonk

从将应用程序代码松散地耦合到其他方面,Spring确实努力做到非侵入性。

在tiem方面,它也朝着这个方向发展。在早期版本中,您需要扩展基类,然后将其移至注释,如今,它越来越多地使用以XML配置的POJO。

与其他应用程序框架相比,这是巨大的战略利益。

1
Benjamin Wootton

Spring现在基本上已经成为平台的一部分。在JEE5和6中的每个地方,您都会发现越来越多的资源注入,因此,如果坚持使用,至少Spring的这一部分将/将仅是平台的另一部分(请参阅@Inject)。其他部分...不确定,尤其是面向方面的编程时。这些服务还有其他提供商,最初来自Google的Guice和来自JBoss的Weld,我相信建立在Guice之上,如果您坚持使用JSR-330,则将提供相同的功能Java注射规格.

青年汽车

1
mezmo