gpt4 book ai didi

java - @Inject、@EJB、@Local、@Remote、@LocalBean 等... : confused?

转载 作者:IT老高 更新时间:2023-10-28 20:52:09 26 4
gpt4 key购买 nike

我有以下配置:

  • 一个 GF 上的 1 个 EAR,包含 2 个带有 EJB 组件的 EJB-JAR。
  • 另一个 Glassfish 服务器(=> 其他 JVM)上的 1 个 WAR,其中包含访问 EJB 组件的 Web 组件。

我的 EAR 的每个 EJB-JAR 中都有 2 个 EJB 业务服务,它们都是这样开发的:

@Remote
public interface ServiceAItf {
...
}

@Stateless
@Local
public class ServiceAImpl implements ServiceAItf {
...
}

在我的 WAR 中,我通过远程接口(interface)上的显式 "InitialContext.lookup" 访问 EJB 组件。

在我的 EAR 中,我对注入(inject)的最佳实践在性能、架构等方面感到很困惑......

我有以下问题:

  • 如你所见,我在服务实现上声明了注解"@Local",没有定义本地接口(interface)。这是对的吗?至少我在部署时没有错误。但也许我应该改用 "@LocalBean" 注释?我想 "@LocalBean" 注释只允许直接作为 "Local" EJB 调用实现,但是您必须像这样在代码中使用实现:

    @无状态@本地的公共(public)类 ServiceBImpl 实现 ServiceBItf { @EJB 私有(private)ServiceAmpl serviceA; ...}

  • 将一个 EJB 注入(inject)另一个 EJB 的最佳方法是什么?它的工作原理是这样的:

    @无状态@本地的公共(public)类 ServiceBImpl 实现 ServiceBItf { @EJB 私有(private)服务AItf服务A; ...}

但据我所知,注入(inject)的“serviceA”是远程代理,而它位于同一个 EAR 文件中的同一个 JVM 中。所以我认为这会对性能产生影响。这就是为什么我尝试像这样注入(inject)服务:

@Stateless
@Local
public class ServiceBImpl implements ServiceBItf {
@Inject
private ServiceAItf serviceA;
...
}

但在 GF 中不起作用,我有以下异常:

WELD-001408 Unsatisfied dependencies for type [...] ...

然后我尝试创建一个本地接口(interface),通过注解“@Inject”的注入(inject)在两个服务时都有效

即使我创建了这样的本地接口(interface),服务也不会通过注释 "@Inject" 注入(inject),而是为空:

@Local
public interface ServiceALocalItf {
...
}

我阅读了很多文章,强烈建议在本地调用时使用 "@Inject" 而不是 "@EJB"。这让我想到了以下问题:在哪种情况下推荐(或简单地使用)"@Local" EJB 调用?

经过所有这些分析,我得出以下结论:

  • 对于每个服务,我创建一个 "@Local" 和一个 "@Remote" 接口(interface)。
  • 从 WAR 到 EAR 的 EJB-JAR,对远程接口(interface)进行 JNDI 查找。
  • 从 EJB-JAR 到 EJB-JAR,通过 "@EJB" 向本地接口(interface)进行注入(inject)。
  • 对于同一个 EJB-JAR 中的两个服务,通过“@Inject”向本地接口(interface)进行注入(inject)。

你怎么看?对吗?

最佳答案

As you can see, I have declared the annotation "@Local" on the service implementation without defining the local interface. Is it correct?

在 EJB 3.1 中,对本地接口(interface)的要求被取消了。除非您明确需要它们,否则无需编写它们。

What is the best way to inject one EJB into another one?

这里要写几件事:

在 Java EE 6 中,Java Enterprise 发生了变化。一个新的 JSR 将所谓的托管 bean(不要与 JSF 托管 bean 混淆)定义为一种在依赖注入(inject)和生命周期管理方面仍然可以从容器中受益的最小组件。这意味着:如果您有一个组件并且“只是”想使用 DI 并让容器控制它的生命周期,那么您不需要为它使用 EJB。当且仅当您明确需要 EJB 功能(如事务处理、池、钝化和集群)时,您最终将使用 EJB。

这使您的问题的答案分为三个部分:

  1. 使用@Inject 而不是@EJB,CDI (a) 的概念适用于所有托管bean(这包括 EJB)和 (b) 是有状态的,因此远优于纯 @EJB DI
  2. 您确定需要 EJB成分?
  3. CDI 绝对值得一看 documentation

关于java - @Inject、@EJB、@Local、@Remote、@LocalBean 等... : confused?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7362257/

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