我应该为Java项目使用哪些框架/技术堆栈?

时间:2014-10-24 17:08:33

标签: java frameworks

我即将在我的组织中开始一个新项目,它必须使用Java和其他可以使用Java消费的开源技术来完成(这是他们提供Java或至少一个RESTful api) 。该项目是中等规模,将从很少的用户开始,如10,但它应该构建为可以随时扩展,并支持更多用户,如100。

这是我想到的当前技术和框架替代方案:

数据库:

  • MySQL 5.6
  • Postgres 9.3

数据访问:

  • Hibernate 4(没有JPA)
  • JPA 2.1 / Hibernate 4
  • MyBatis的

依赖注入框架,用于创建服务层并可能增强其他层,如Dao或Presentation:

  • 手动,无框架
  • Spring core
  • CDI(上下文依赖注入)
  • Guice(我刚听说过,我想尝试一下,但不确定)

网络用户界面:

  • Spring MVC
  • JS​​F
  • GWT
  • Struts 2
  • AngularJS
  • 网络组件

请提供建议。我很感激你的帮助。感谢。

1 个答案:

答案 0 :(得分:2)

首先要注意的是,这些问题分为两类

  • 太宽。有很多东西要解释,要提供的例子,以及更难的事情:提供一个有效的例子,满足大多数读者的最低要求。
  • 主要基于意见。有许多具有不同专业知识的人已经尝试了几乎所有这些框架,并得出了很多因素的结论。例如:项目规模,开发代码的能力,开发可靠解决方案的能力,项目预算,团队在Java或其他相关技术方面的专业知识,花在学习技术上的时间/框架......等等。有了这个基础,为什么不说,有很多人的口味,人们会向你展示一些技术的金牌,并对其他人咆哮。

通过上述要点,您可以直接推断没有具体答案。但也有其他选择来定义你应该使用的东西。

  • 定义您的quality attributes。这就是,收集project stakeholders对这个新应用,系统,生态系统或项目所具有的任何大小的相关非功能性要求。其中一些可能是这种形式:

    • 应用程序必须在工作时间内支持大量用户。这是上午8点到下午5点。
    • 应用程序每页应该有一个“帮助我”选项。
    • 该应用程序必须支持英语和西班牙语。
    • 除非记录,否则没有人可以使用该应用程序。应监控用户执行的所有操作。

    如果您按类别对它们进行分组会更好。这是list of system quality attributes

  • 一旦获得了质量属性和每个属性的描述,就可以在利益相关者的帮助下对其进行优先排序,并且只需要一小部分。这些将是架构必须满足的要求,否则项目将失败(这取决于项目的具体情况,但通常会发生这种情况)。

  • 要使用一组质量属性,您可以开始优化它们并为每个属性指定指标。度量标准在软件体系结构中是必需的,因为它们提供了一种测量软件的方法,您将使用该方法来验证和评估技术或技术集。只有具备资格(数量),您和其他人才能检查结果并根据技术提供结论。

  • 通过定义质量属性和指标,您可以建立一个测试套件,可以帮助您为指标提供值,并帮助您客观地评估和面对框架。这类似于建立一个跆拳道环并将两个框架相互对立。规则已定义,将成为单一赢家(这也可能因您的要求而异)。

    重要:并非所有测试用例都应基于程序化。例如,您可能具有与应用程序的modifiability关联的质量属性:使用当前代码库添加Foo功能是多么容易,您将通过添加 Foo来衡量到您当前的设计并添加从 Piece of Cake Rocket Science 的序数限定(或0到5更易于理解)。

  • 使用定义的框架/技术开始设计和实现概念验证,然后针对它执行测试套件。您必须记住,此框架/技术和您正在进行的设计必须支持所选的质量属性,因此请尝试使它们为测试闪耀(然后它们将在真实的应用程序中闪耀)。

  • 根据框架执行测试套件后,按框架/技术注释结果。最后,您将获得一份清单以及每种清单的结果,并且可以更容易地做出选择。

我将为上面显示的数据访问框架提供一个示例:

  

数据访问:

     
      
  • Hibernate 4(没有JPA)
  •   
  • JPA 2.1 / Hibernate 4
  •   
  • MyBatis的
  •   

确定质量属性。例如,我们只有一个类别:Performance。

  • 性能:
    • 应用程序应在正常情况下处理20 000个Foo交易。
    • 应用程序应在正常情况下在不到3秒的时间内为Foo实体提供搜索结果。

指标:

  • 性能:
    • 在Foo表中插入20 000的时间。
    • 在Foo表中删除20 000的时间。
    • 时间从Foo表中检索20 000个结果。

测试套件:

  • 性能:
    • 在Foo表中插入20 000个。
    • 从Foo表中删除20 000。一个接一个。
    • 时间从Foo表中检索20 000个结果。

测试注意事项(这是针对测试用例的):

  • Foo表与FooDetailFooStatusHistory有关系。每次我们在Foo表格中插入一行时,我们必须在FooDetail中插入3行,在FooStatusHistory中插入2行。
  • 每次我们检索Foo时,我们还必须检索与FooDetail相关联的关联FooStatusHistory最后 Foo
  • Foo表将从20 000行开始。 FooDetail将从Foo行的3行开始。 FooStatusHistory将从Foo行的每行开始。

然后,在我的测试环境中使用框架设计,实现和执行测试之后:

  • 操作系统:Windows 7 Professional 64位
  • JVM:Java SE 8 u20
  • 数据库:MySQL 5.6

以秒为单位的结果(10次运行后的平均值):

                                    Hibernate 4    JPA 2.1/Hibernate 4    MyBatis

- Insert 200 000 in Foo table.        120.42              125.14           94.47
- Delete 200 000 from Foo table.
  One by one.                         120.05              128.41           55.13
- Time to retrieve 200 000 results
  from Foo table.                      36.12               34.24            4.01