- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对 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 消息左右。
OrderService
示例在 EJB 2.x 中至少需要 5 倍的代码和一些 XML 代码)。 Spring 提供了一个更好的替代方案,它需要更少的 Java 代码(但仍然需要很多 XML 代码)。 J2EE/EJB2 吸取了 Spring 的教训,并随 Java EE 5 一起提供,它提供了新的 EJB3 API,它比 Spring 更加灵活并且根本不需要 XML。
@Component
/
@Autowired
和 CDI
@Named
/
@Inject
您可以使用
@ManagedBean
实现与 JSF 相同的效果/
@ManagedProperty
,但 Spring DI 和 CDI 围绕它提供了更多优势:例如,您可以编写拦截器来预处理或后处理托管 bean 创建/销毁或托管 bean 方法调用,您可以创建自定义范围、生产者和消费者,您可以在范围更广的实例中注入(inject)范围更窄的实例,等等。
关于spring - 什么时候需要或方便使用 Spring 或 EJB3 或将它们全部一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18369356/
在javascript中,我可以这样写 console.log( person.name || person.nickname || '-' ) 然后会先查找name字段,如果找不到,会回退到nick
在为通用接口(interface)编写回调时,定义他们自己负责创建和访问的本地数据可能很有用。 在 C 中,我只使用一个空指针,类 C 示例: struct SomeTool { int ty
我是一名优秀的程序员,十分优秀!