- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个基于 Java EE 的产品,我在其中使用了 GlassFish 3 和 EJB 3.1。
我的申请有 session beans ,调度程序并使用网络服务。我最近才知道Apache TomEE , 支持 Contexts and Dependency Injection (CDI) . GlassFish 容器还支持 CDI。
我可以替换不需要 CDI 还没有提供的任何功能的 session bean 吗?如果那样的话,我可以获得什么好处?
最佳答案
是的,您可以自由地混合 CDI 和 EJB 并获得一些不错的结果。听起来您正在使用 @WebService
和 @Schedule
,这是将 EJB 添加到组合中的充分理由。
那里有很多困惑,所以这里有一些关于 EJB 和 CDI 的一般信息,因为它们相互关联。
EJB >= CDI
请注意,EJB 是 CDI bean 因而具有 CDI 的所有优点。反过来不是这样(还)。所以绝对不要养成思考“EJB vs CDI”的习惯,因为这种逻辑实际上转化为“EJB+CDI vs CDI”,这是一个奇怪的等式。
在 Java EE 的 future 版本中,我们将继续调整它们。对齐的意思是允许人们做他们已经可以做的事情,只是没有 @Stateful
, @Stateless
或 @Singleton
注释在顶部。
实现条款中的 EJB 和 CDI
最终,EJB 和 CDI 共享相同的代理组件基本设计。当您获得对 EJB 或 CDI bean 的引用时,它不是真正的 bean。相反,您得到的对象是假的(代理)。当你在这个假对象上调用一个方法时,调用会转到容器,容器将通过拦截器、装饰器等发送调用,并处理任何事务或安全检查。完成所有这些后,调用最终会转到真实对象,结果通过代理传回给调用者。
区别仅在于如何解析要调用的对象。 “已解决”只是指容器在何处以及如何查找要调用的真实实例。
在 CDI 中,容器查看“范围”,它基本上是一个存在特定时间段的哈希图(每个请求 @RequestScoped
,每个 HTTP session @SessionScoped
,每个应用程序 @ApplicationScoped
,JSF 对话 @ConversationScoped
,或根据您的自定义范围实现)。
在 EJB 中,如果 bean 的类型为 @Stateful
,容器也会查看哈希图。 .安 @Stateful
bean 还可以使用任何上述范围注释,使其与范围内的所有其他 bean 一起生存和消亡。在 EJB @Stateful
本质上是“任何范围的”bean。 @Stateless
基本上是一个实例池——您在一次调用期间从池中获取一个实例。 @Singleton
本质上是 @ApplicationScoped
因此,从根本上讲,您可以用“EJB”bean 做的任何事情都应该可以用“CDI”bean 做。在封面下,很难将它们区分开来。除了如何解析实例之外,所有管道都是相同的。
就容器在执行此代理时将提供的服务而言,它们目前并不相同,但正如我所说,我们正在 Java EE 规范级别进行处理。
性能说明
忽略您可能拥有的任何“轻”或“重”心理图像。这就是营销。它们大部分具有相同的内部设计。 CDI 实例解析可能稍微复杂一些,因为它稍微更加动态和上下文。相比之下,EJB 实例解析相当静态、愚蠢和简单。
我可以从 TomEE 的实现角度告诉您,调用 EJB 与调用 CDI bean 之间的性能差异几乎为零。
默认为 POJO,然后是 CDI,然后是 EJB
当然,在没有好处的情况下不要使用 CDI 或 EJB。当您开始需要注入(inject)、事件、拦截器、装饰器、生命周期跟踪和类似的东西时,请使用 CDI。大部分时间都是这样。
除了这些基础知识之外,还有许多有用的容器服务,只有在通过添加 @Stateful
使 CDI bean 也成为 EJB 时,您才可以选择使用。 , @Stateless
, 或 @Singleton
就可以了。
这是我何时拆分 EJB 的简短列表。
使用 JAX-WS
暴露 JAX-WS @WebService
.我很懒。当@WebService
也是一个EJB,您不必在web.xml
中列出它并将其映射为servlet。文件。这对我来说是工作。另外,我可以选择使用下面提到的任何其他功能。所以这对我来说是不费吹灰之力的。
可联系 @Stateless
和 @Singleton
只有。
使用 JAX-RS
通过 @Path
公开 JAX-RS 资源.我还是很懒。当 RESTful 服务也是 EJB 时,您再次获得自动发现,而不必将其添加到 JAX-RS Application
子类或类似的东西。另外,我可以公开与 @WebService
完全相同的 bean如果我想或使用下面提到的任何强大的功能。
可联系 @Stateless
和 @Singleton
只有。
启动逻辑
通过 @Startup
在启动时加载.目前在 CDI 中没有与此等效的内容。不知何故,我们错过了添加类似 AfterStartup
的内容。容器生命周期中的事件。如果我们这样做了,您就可以拥有 @ApplicationScoped
bean 监听它并且实际上与 @Singleton
相同与 @Startup
.它在 CDI 1.1 的列表中。
可联系 @Singleton
只有。
并行工作@Asynchronous
方法调用。在任何服务器端环境中启动线程都是禁忌。线程过多是一个严重的性能杀手。这个注解允许你使用容器的线程池并行化你所做的事情。这太棒了。
可联系 @Stateful
, @Stateless
和 @Singleton
.
安排工作@Schedule
或 ScheduleExpression
基本上是一个 cron 或 Quartz
功能。也非常棒。大多数容器只是在封面下使用 Quartz 来实现这一点。然而,大多数人不知道,Java EE 中的调度工作是事务性的!如果您更新数据库然后安排一些工作并且其中一个失败,则两者都会自动清理。如果EntityManager
持久调用失败或刷新出现问题,无需取消调度工作。是的,交易。
可联系 @Stateless
和 @Singleton
只有。
在 JTA 事务中使用 EntityManager
以上关于交易的说明当然需要您使用 JTA
托管 EntityManager
.您可以将它们与普通的“CDI”一起使用,但是如果没有容器管理的事务,它会变得非常单调,重复 UserTransaction
提交/回滚逻辑。
适用于所有 Java EE 组件,包括 CDI、JSF @ManagedBean
, @WebServlet
, @WebListener
, @WebFilter
等 @TransactionAttribute
但是,注释可用于 @Stateful
, @Stateless
和 @Singleton
只有。
保持 JTA 管理 EntityManager
EXTENDED
托管 EntityManager
允许您保留 EntityManager
之间开放 JTA
交易而不会丢失缓存的数据。适合时间和地点的好功能。负责任地使用:)
可联系 @Stateful
只有。
轻松同步
当您需要同步时,@Lock(READ)
和 @Lock(WRITE)
注释非常好。它允许您免费获得并发访问管理。跳过所有 ReentrantReadWriteLock 管道。在同一个桶中是 @AccessTimeout
,它允许你说一个线程在放弃之前应该等待多长时间才能访问 bean 实例。
可联系 @Singleton
只有 bean 类。
关于jakarta-ee - 在哪里使用 EJB 3.1 和 CDI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13487987/
我想了解为什么一些 Jakarta EE 规范是空的。 例如 Jakarta Annotations规范由免责声明和快速描述(3 行)组成,但是有 Javadoc . 当 JCP 负责 J2EE 规范
我正在研究 OpenNTF 项目“XPages Jakarta EE Support”。 我正在尝试为 Person 对象上的 CRUD 操作设置 REST API。我设法创建 GET 和 POST
我正在研究 OpenNTF 项目“XPages Jakarta EE Support”。 我正在尝试为 Person 对象上的 CRUD 操作设置 REST API。我设法创建 GET 和 POST
我正在采用 Jakarta EE 9 并使用 EJB 和 WEB 模块开发一个 EE 应用程序。 EJB 已经完成并部署在 Glassfish 6(Jakarta EE 9 的 RI 实现)上。现在,
OpenLiberty(v20.0.0.2-beta 或其他版本)中是否有办法将 jakarta ee 9(通过 webProfile-9.0 或 jakartaee-9.0 或任何仅 jakarta
在使用Spring Boot 3.0.7并试图保持更新时,我遇到了这个错误,不知道它是什么意思。。加载的依赖项是Spring Security 6.0.9,问题存在于使用Java 17或19的情况下(
有没有办法在 JPA 实体监听器中检查当前事务是否已提交,如下所示? @ApplicationScoped public class EntityListener { @Inject
以下代码使用 javamail api 通过 gmail smtp 服务器发送邮件和附件。 public void doSendGmail(){ from = txtFrom.getT
大家好我有一个应用程序(spring+hibernate)需要同时发送数千封电子邮件我被告知这里最好的解决方案是有一个邮件服务器我不知道从哪里开始,或者是否有更好的框架或服务所以请大家给我一些信息,从
我正在尝试从 Java 邮件的文件夹中删除/删除消息(在我将其复制到另一个文件夹之后),这是我的代码: Flags deleted = new Flags("DELETED"); folder.se
某些页面可以接收称为“P1”的特定请求参数: page.do?P1=value1 现在,一个scriptlet正在测试request参数的存在,如果P1为“value1”,则会在页面上呈现一些信息。
我有一段非常类似于此http://java.sun.com/developer/onlineTraining/JavaMail/contents.html#JavaMailFetching的代码 我的
我在NetBeans中创建了一个Java Web应用程序项目,并在其中创建了一个启动bean: package malibu.util; import javax.annotation.PostCon
我有两个不同的项目:A 和 B。 B 包含一个拦截器,我想在项目 A 以及将来的项目 C 和 D 中使用它。 我在两个项目中都使用 jboss-javaee-6.0 版本 3.0.3.Final(这意
我一直在阅读 “Java 事务” ,我一直困惑它是什么?什么是有用的? 最佳答案 你可以谷歌搜索并找到这样的页面:http://www.java-tips.org/java-ee-tips/enter
这个问题在这里已经有了答案: What exactly is Java EE? (5 个回答) Difference between an application server and a servl
Web 应用程序的用户界面通常包含用于执行 CRUD 操作的各种按钮。在执行以下操作时,按钮标签的建议命名约定是什么? 用户创建(添加用户...或添加用户或添加用户) 事件创建(添加事件...或添加事
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我对java网页环境很陌生。最近尝试用Java开发一个电子商务平台。 因此,我使用 j_security_check 基于表单作为我的身份验证工具。身份验证完成后,成功重定向到所需页面。 但是,由于我
什么时候 我通过无状态服务从数据库中获取实体, 然后在另一个 bean 和 中修改它 然后想通过无状态服务将其保存到数据库中, 我注意到实体已分离。我认为因为无状态服务的持久化上下文,实体从被夺取到存
我是一名优秀的程序员,十分优秀!