我计划开始一个新项目,并正在研究当前最先进的 Java Web 框架。我决定围绕 Guice 构建我的应用程序,并且可能会使用非常轻量级的 ORM,例如 Squill/JEQUEL/JaQu 或类似的,但我无法决定使用 Web 框架。哪一个最适合这样一个轻量级的环境?哪一个与 Guice 结合得最好?
6 回答
当我在 11 月开始编写一个新项目时,我已经收集了一些关于这个主题的经验。该项目现在处于后期阶段。
对我来说,以下设计指南很重要:
- 使用既有趣又会在未来普遍使用的现代技术堆栈。
- 减少项目工件的数量——在有意义的地方使用注释/Java 代码,省略 XML。
- 使用开源框架
- 拥有一个活跃的社区
- 不是alpha阶段
- 重量轻
- 避免概念重复
- 我可以向我的两位开发人员解释其中的概念,尽管他们是优秀的程序员,但他们从未使用过依赖注入(DI) 或 Web 框架。
- 可以作为未来项目的技术基础
Google Guice作为 DI 容器是一个显而易见的选择 - 显然是最深思熟虑的 DI 容器,拥有出色的开发人员和良好的社区。它满足了上面提到的所有要点。
所以我建立了我的基本技术堆栈。从 Guice 开始,添加了Hibernate以实现持久性(以及warp-persist和warp-servlet)。然后我写了一些基本的DAO来选择一些东西。
然后我尝试执行以下操作:在此之上添加了一个不同的 Web 框架。
- 使用常规 HTTP servlet和xStream的XSLT
- JSF-MyFaces
- 阿帕奇检票口
- 经线小部件
我创建了一个简单的页面,其中包含一个表格,由 DAO、标题和一个包含所有四个框架的文本字段填充。
这些是我比较四个框架时的发现。
XSLT 和 XStream 是一种硬核方法。它不是一个真正的框架,而是一种适用于高性能应用程序的可行的完全无状态的技术。这是迄今为止提供测试页面的最快方式。在调试模式下,本地主机上 3 毫秒,而其他框架大约 30-50 毫秒。
使用 warp-servlet 的 Guice 集成相对顺利和良好,这使我能够注入 servlet 并在其他对象中注入 httprequest、httpresponse、session,而无需传递它们。缺点:根本没有社区,因为我是唯一会考虑这个堆栈的人。- 没有现成的组件。
然后我看了一下 JSF 和 Guice:当然可以将注入器放在 servlet 上下文中,并使用 guice 作为服务定位器。使用简单的方法,不可能在其他地方注入支持 bean。使用自定义变量解析器可以部分解决这个问题,但是您会丢失 JSF 文件中的所有IDE集成,而且您将不得不为支持 bean 使用丑陋的FQN,或者在某处构建字符串->Guice 键映射。两者都很丑:
- 优点:良好的社区,就业市场上有很多开发人员(对我来说没有标准)。如果出现问题,您不会因为选择 JSF 而被解雇。
- 缺点:带来了自己的控制反转(IoC) 机制,在概念上与 guice 冲突。
warp-widgets:为了好玩,我创建了我的简单示例;这是早期的阿尔法阶段。它很好用,它的组件很容易实现和我自己重用。它旨在提供具有完美 Guice 集成的类型安全 HTML。由于当时看起来它只有一个活跃的开发人员,现在可能正在开发 Guice 2.0,我想说这个社区几乎不存在。它就像一个魅力,相当快,但我会成为 alpha 测试员。这对我来说风险太大,无法考虑将其用于商业项目。
Apache Wicket:这个项目首先让我吃惊的是 wicket-ioc 和 wicket-guice 在核心下载中结合在一起。网页中的构造函数注入是不可能的,只有setter+field。在 Wicket 网页中注入很容易,只需添加@Inject
到您要填写的字段中 - 但您不应该了解它在后台是如何工作的。棘手的事情正在发生。理论上可以注入网页 - 但我没有使用过一次,因为这使得无法使用挂载的 URL,而且它会混淆持久化/序列化状态。类的注入成员被透明地处理为网页序列化,这是启用浏览器支持所必需的。Wicket 使用零外部工件 - 只需对URL进行一些配置在应用程序类中。所以所有的配置都是用 Java 完成的——这很适合 Guice 模型。HTML 和 Java 的清晰分离。它是开源的,就像大多数数量众多且质量良好的组件一样。它自 2005 年(?)以来就已经存在,并且是一个顶级 Apache 项目。尽管它是一个功能丰富的框架,但它的API相当紧凑(所有核心类都适合我屏幕上的单个JPEG)。与其他人不同的是,它并没有带来自己的 IoC 机制,而是将 IoC 视为可以由Spring Framework、 Guice 等提供的服务,并且这种理念使其优于 Guice 集成。我是否提到过非常智能和简单的 Ajax 支持?
未深入评估的框架:tapestry5 - 带来了自己的 IoC。 Seam:它本身不是一个框架,而是一个元框架,通常来自 Spring、JSF。休眠。(尽管理论上 Spring 可能会被 Guice 取代。)
总结:在评估的框架中,Apache Wicket 是明显的赢家——就 Guice 集成 + 所有其他提到的标准而言。
除了我们两个,其他人之前也遇到过这个问题。
Wicket 有一个内置的 Guice 模块,我没有使用过(但我已经使用了很多Wicket,并且很喜欢它)。
这是一篇关于将 Guice 与 Stripes 集成的文章
Play 框架是一个不错的框架。它有 Guice 支持(我还没有尝试过)。
Mojave MVC Web 框架是一个包含 Guice 的非常简单、轻量级的框架。