简单但很好的 EJB 模式

Posted

技术标签:

【中文标题】简单但很好的 EJB 模式【英文标题】:Simple but good pattern for EJB 【发布时间】:2011-02-27 13:05:08 【问题描述】:

对于以下解决方案,您有什么建议作为一个好的、实用但简单的模式:

html + JSP(作为视图/演示) Servlet(控制器、请求、会话处理) EJB(持久性、业务逻辑) mysql 数据库

是否有必要使用自己的 DAO 层来进行持久化?我使用 JPA 将对象持久保存到我的数据库中。

我应该从我的 EJB 中撤回业务逻辑吗?所有在线资源都告诉我不同​​的事情并使我感到困惑......

【问题讨论】:

【参考方案1】:

我肯定会将业务逻辑放在无状态会话 Bean 中。无状态会话 bean 很好,因为它们很好地捕获了事务边界。并将 View 层与持久层解耦。

注意 SSB 的方法与用户想要实现的小型企业目标相对应。

另外一点是,你必须确保你返回的数据包含对象树中的所有数据,并且你不要依赖延迟加载来获取其余数据,因为这会导致各种问题。

尽可能远离有状态会话 Bean:它们是个坏消息,并且在 Web 应用程序的上下文中是一个错误的概念。

对于长期运行的事情,请考虑使用通过发送 JMS 消息触发的消息驱动 Bean。这些是进行后台处理的好方法,它可以更快地释放业务逻辑、缩短事务并将控制权更快地返回给最终用户。

【讨论】:

您关于 SFSB 的说法过于极端。初学者应该谨慎使用它们,高级用户可能应该适度使用它们,但恕我直言,它们不是要不惜一切代价避免的。如果你使用它们,你可能确实想给它们一个 CDI 范围。【参考方案2】:

对于使用 JSP/Servlets + EJB + MySQL 的解决方案,您有什么建议作为一个好的、实用但简单的模式

使用您选择的 MVC 框架,无状态会话 Bean 用于业务逻辑和事务管理(如果您不需要远程处理,则首选本地接口),实体用于持久性。

尽可能地注入您的 EJB(如果您使用的是 Java EE 6,这意味着在任何地方,您也可以跳过该接口)。

是否有必要使用自己的 DAO 层来进行持久化?我使用 JPA 将对象持久保存到我的数据库中。

有些人可能会说是,我在大多数情况下会说不。 EntityManager 已经实现了 Domain Store 模式,对于简单的需求,无需将其屏蔽在 DAO 后面。

您可能需要阅读以下资源以获得更多关于此的意见:

Has JPA Killed the DAO?, JPA/EJB3 killed the DAO, 和更新的DAOs Aren't Dead - But They Either Collapsed Or Disappeared

我应该从我的 EJB 中撤回业务逻辑吗?

我不会。将您的业务逻辑放在您的(无状态)会话 Bean 中。 EJB3 是 POJO,它们易于测试,无需将业务逻辑委托给另一层。

【讨论】:

【参考方案3】:

Anno 2012 我不建议使用 Servlet 和 JSP 作为表示层。这在 2002 年风靡一时,但那是十年前的事了。

如今,Java EE 拥有一个出色的 MVC 框架,称为 JSF。你最好改用这个。您很可能希望从组件库 PrimeFaces 中获取一些小部件,因为所有标准部件都有点基础。像 OmniFaces 这样的实用程序库也是一个很好的补充。

关于 DAO;不要直接在 (JSF) 支持 bean 中使用实体管理器,但如果您已经为业务逻辑使用服务类(事务边界),那么使用 DAO 也可能是矫枉过正。

DAO 仍有一些小的优点,例如 dao.findByName(...) 看起来比加载命名查询、设置参数和获取(单个)结果要清晰一些,但代价是你必须为每个实体维护一个单独的 DAO,可能除了一些服务之外。

【讨论】:

不确定是在 2012 年,但 JSF 在我们的大多数应用程序中都是一个巨大的膨胀软件。我们做的大部分是数据报告,所以 idk,使用 ajax 和大量的 javascript 似乎要快得多 2012 年的 JSF 还不错。 2016 年即将推出 2.3,而 OmniFaces 会更好。

以上是关于简单但很好的 EJB 模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式这样玩泰简单(Golang版)-外观模式

EJB是什么

EJB

EJB

动手造轮子:实现一个简单的 EventBus

Java设计模式百例 - 简单工厂模式