我知道这个问题有点悬而未决,但我一直在考虑将Scala/Lift作为Java/Spring的替代方案,我想知道Scala/Lift相对于它有什么真正的优势.根据我的观点和经验,Java批注和Spring确实最大限度地减少了您必须为应用程序编写的代码量.Scala/Lift对此有改进吗?

推荐答案

Let's assume we're equally comfortable in Scala and Java, and ignore the (huge) language differences except as they pertain to Spring or Lift.

Spring和Lift在成熟度和目标上几乎截然相反.

  • 春天比春天早五年
  • Lift是一个整体,只面向Web;Spring是模块化的,面向Web和"常规"应用程序
  • Spring支持过多的JavaEE特性;Lift忽略了那些东西

总而言之,弹簧是重量级的,电梯是轻量级的.如果有足够的决心和资源,你可以颠覆这一点,但你需要两者兼得lot分.

在使用了这两种框架之后,以下是我脑海中根深蒂固的具体差异.这不是一份详尽的 list ,我无论如何也无法编译.我觉得最有趣的就是...

  1. 观哲学

    Lift鼓励在代码段/操作方法中放置一些视图material .特别是代码片段,将会散布以编程方式生成的表单元素、<div><p>等.

    这是强大而有用的,特别是因为Scala有一个内置的语言级XML模式.可以在Scala方法中内联编写XML,包括大括号中的变量绑定.这对于非常简单的XML服务或服务模型可能是令人愉快的--您可以在一个非常简洁的文件中生成一套HTTP响应操作,而不需要模板或很多附带的配置.缺点是复杂性.根据您走得多远,视图和逻辑之间的关注点要么模糊分离,要么不分离.

    相反,在webapp中经常使用Spring会将视图和其他所有东西严格分开.我认为Spring支持几个模板引擎,但我只在严肃的场合使用过JSP.用JSP进行受Lift启发的"模糊MVC"设计将是疯狂的.这在大型项目中是件好事,因为在这些项目中,仅仅阅读和理解的时间可能是压倒性的.

  2. 对象关系映射器 Select

    Lift的内置ORM是"Mapper".有一个即将到来的替代方案叫做"记录",但我认为它仍然被认为是阿尔法之前的.LiftWeb的书中有关于使用Mapper和JPA的章节.

    Lift的CRUDify功能虽然很酷,但只适用于Mapper(而不是JPA).

    当然,Spring支持panoply of standard and/or mature database technologies.这里的关键词是"支持".从理论上讲,您可以将任何Java ORM与Lift结合使用,因为您可以从Scala调用任意Java代码.但Lift只支持Mapper和(在较小程度上)JPA.此外,在Scala中使用非平凡的Java代码目前并不像人们希望的那样无缝;使用Java ORM,您可能会发现自己在任何地方都使用Java和Scala集合,或者在Java组件内外转换所有集合.

  3. 配置

    Lift应用程序几乎完全是通过应用程序范围内的"Boot"类来配置的.换句话说,配置是通过Scala代码完成的.这非常适合具有简单配置的项目,并且当进行配置的人员可以轻松编辑Scala时.

    Spring在配置方面非常灵活.许多配置选项可以通过XML配置或注释来驱动.

  4. 文档

    Lift的文档还很年轻.春天的doctor 已经相当成熟了.这不是比赛.

    因为Spring的文档已经组织得很好并且很容易找到,所以我将判断我为Lift找到的文档.Lift文档基本上有4个来源:LiftWeb BookAPI Docs、LiftWeb Google group和"Getting Started".还有一套不错的代码示例,但我不认为它们本身就是"文档".

    API文档不完整.LiftWeb图书已经在树上出版了,但它也可以在网上免费获得.它真的很有用,尽管它明确的说教风格有时会激怒我.辅导课长了点,合同短了点.弹簧有适当的手册,这是升降机所缺乏的.

    但Lift确实有一系列很好的例子.如果你阅读Lift代码和示例代码(而且你已经很了解Scala),你可以在很短的时间内解决问题.

这两个框架都很有说服力.有各种各样的应用程序,你可以从中 Select 一个,做得很好.

Java相关问答推荐

计算战舰沉船/船只的问题(Java)

Jooq隐式地将bigint转换为数字,并且索引不起作用

try Dockerize Maven应用程序,但发布版本21不支持"

无法在Java中将hhmmss格式的时间解析为LocalTime

JDK22执行repackage of goal org. springframework. boot:spring—boot—maven—plugin:3.2.3:repackage failed:unsupported class file major version 66—>

Character::Emoji不支持带数字的字符吗?

所有 case 一起输入时输出错误,而单独放置时输出正确

使用Spring Boot3.2和虚拟线程的并行服务调用

无法了解Java线程所消耗的时间

测试何时使用Mockito强制转换对象会导致ClassCastException

把一条整型短裤和两条短裤装成一条长的

垃圾回收器是否真的删除超出作用域的对象?

如果List是一个抽象接口,那么Collectors.toList()如何处理流呢?

从泛型枚举创建EnumMap

插入中的JOOQ序列,设置为VS值

使用迭代器遍历HashMap不会因IF条件而停止

泛型与泛型问题的完美解决方案?

如何在特定关键字后提取与模式匹配的多个值?

当我try 返回可选时,Mock无法正常工作

ExecutorService:如果我向Executor提交了太多任务,会发生什么?