gpt4 book ai didi

spring - 什么时候需要或方便使用 Spring 或 EJB3 或将它们全部一起使用?

转载 作者:IT老高 更新时间:2023-10-28 13:04:55 25 4
gpt4 key购买 nike

我对 JSF2+Spring+EJB3 或它们的任意组合的混合使用感到有些困惑。我知道 Spring 的主要特征之一是依赖注入(inject),但是对于 JSF 托管 bean,我可以使用 @ManagedBean@ManagedProperty注释,我得到了依赖注入(inject)功能。对于 EJB3,我更困惑于何时将它与 JSF 一起使用,或者是否有理由使用它。

那么,在什么样的情况下使用Spring+JSF2或者EJB3+JSF2比较好呢?

到现在为止,我只使用 JSF2 创建了一些小型 Web 应用程序,并且从未需要使用 Spring 或 EJB3。但是,我在很多地方看到人们正在一起使用所有这些东西。

最佳答案

首先,Spring 和 EJB(+JTA) 是相互竞争的技术,通常不会在同一个应用程序中一起使用。选择其中之一。 Spring EJB(+JTA)。我不会告诉你选择哪个,我只会告诉你一些历史和事实,以便你更容易做出决定。

他们试图解决的主要问题是提供具有自动事务管理功能的业务服务层 API。想象一下,您需要触发多个 SQL 查询来执行单个业务任务(例如下订单),并且其中一个失败了,那么您当然希望一切都回滚,以便数据库保持相同的状态和之前一样,就好像完全没有发生过一样。如果您没有使用事务,那么数据库将处于无效状态,因为第一组查询实际上成功了。
如果您熟悉基本的 JDBC,那么您应该知道这可以通过关闭连接上的自动提交,然后按顺序触发这些查询,然后执行 commit() 来实现。在同一 try在谁catch (SQLException) rollback()被执行。然而这是相当tedious每次都执行。
使用 Spring 和 EJB(+JTA),默认情况下,单个(无状态)业务服务方法调用会透明地作为单个完整事务进行计数。这样你就完全不用担心事务管理了。您不需要手动创建 EntityManagerFactory ,也没有明确调用 em.getTransaction().begin()就像您将业务服务逻辑紧密耦合到 JSF 支持 bean 类和/或使用 RESOURCE_LOCAL 时所做的那样。而不是 JTA在 JPA 中。例如,您可以使用 JPA 只有以下 EJB 类:

@Stateless
public class OrderService {

@PersistenceContext
private EntityManager em;

@EJB
private ProductService productService;

public void placeOrder(Order newOrder) {
for (Product orderedproduct : newOrder.getProducts()) {
productService.updateQuantity(orderedproduct);
}

em.persist(newOrder);
}

}
如果您有 @EJB private OrderService orderService;在您的 JSF 支持 bean 中并调用 orderService.placeOrder(newOrder);在 action 方法中,将执行单个完整事务。例如,如果 updateQuantity() 之一电话或 persist()调用失败并出现异常,然后它将回滚到目前为止执行的任何 updateQuantity()调用,并使数据库保持干净清爽的状态。当然,您可以在 JSF 支持 bean 中捕获该异常并显示一个 faces 消息左右。
应该注意的是,“Spring”是一个相当大的框架,它不仅可以与 EJB 竞争,还可以与 CDI 和 JPA 竞争。以前,在黑暗的 J2EE 时代,EJB 2.x 的实现极其糟糕(上面的 EJB 3.x OrderService 示例在 EJB 2.x 中至少需要 5 倍的代码和一些 XML 代码)。 Spring 提供了一个更好的替代方案,它需要更少的 Java 代码(但仍然需要很多 XML 代码)。 J2EE/EJB2 吸取了 Spring 的教训,并随 Java EE 5 一起提供,它提供了新的 EJB3 API,它比 Spring 更加灵活并且根本不需要 XML。
Spring 还提供开箱即用的 IoC/DI(控制反转;依赖注​​入)。这是在由 XML 配置的 J2EE 时代,这可能非常过分。现在 Spring 也使用注解,但仍然需要一些 XML。从 Java EE 6 开始,在吸取了 Spring 的教训后,CDI 开箱即用,以提供相同的 DI 功能,但不再需要 XML。带 Spring DI @Component/ @Autowired和 CDI @Named/ @Inject您可以使用 @ManagedBean 实现与 JSF 相同的效果/ @ManagedProperty ,但 Spring DI 和 CDI 围绕它提供了更多优势:例如,您可以编写拦截器来预处理或后处理托管 bean 创建/销毁或托管 bean 方法调用,您可以创建自定义范围、生产者和消费者,您可以在范围更广的实例中注入(inject)范围更窄的实例,等等。
Spring 还提供了本质上与 JSF 竞争的 MVC。将 JSF 与 Spring MVC 混合使用是没有意义的。进一步 Spring 还提供了 Data,它本质上是一个在 JPA 之上的额外抽象层,进一步最小化了 DAO 样板(但它本质上并不代表整个业务服务层)。
也可以看看:
  • What exactly is Java EE?
  • JSF Controller, Service and DAO
  • @Stateless beans versus @Stateful beans
  • 关于spring - 什么时候需要或方便使用 Spring 或 EJB3 或将它们全部一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18369356/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com