@Inject,@EJB,@Local,@Remote,@LocalBean等......:困惑?

我有以下配置:

  • 1个包含2个EJB组件的EJB的EAR。
  • 1个包含访问EJB组件的Web组件的Glassfish服务器(=>其他JVM)上的WAR。
  • 在我的EAR的每个EJB-JAR中,我有两个EJB业务服务,它们都是这样开发的:

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

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

    在我的EAR中,我对性能,体系结构等方面的最佳注入实践感到困惑......

    我有以下问题:

  • 正如你所看到的,我已经在服务实现上声明了注解“@Local”,而没有定义本地接口。 这是对的吗? 至少我在部署时没有错误。 但也许我应该使用“@LocalBean”注释呢? 我假设“@LocalBean”注释只是允许直接作为“本地”EJB调用实现,但是您必须像这样在代码中使用实现:

    @Stateless @Local public class ServiceBImpl实现ServiceBItf {@EJB private ServiceAmpl serviceA; ...}

  • 将一个EJB注入另一个EJB的最佳方式是什么? 它是这样工作的:

    @Stateless @Local public class ServiceBImpl实现ServiceBItf {@EJB private ServiceAItf serviceA; ...}

  • 但是从我注意到的情况来看,注入的“serviceA”是远程代理,而它在同一个EAR文件中的同一个JVM中。 所以我认为会对表演产生影响。 这就是为什么我试图注入这样的服务:

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

    但它在GF中不起作用,我有以下例外:

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

    然后我尝试创建一个本地接口,并通过注释“@Inject”注入两个服务

    即使我创建了这样的本地接口,服务也不是通过注解“@Inject”注入,而是注入为空:

    @Local
    public interface ServiceALocalItf {
        ...
    }
    

    我读了很多文章,强烈建议在本地调用时使用“@Inject”而不是“@EJB”。 这导致我出现以下问题:在这种情况下,建议(或简单使用)“@Local”EJB调用?

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

  • 对于每项服务,我创建了一个“@Local”和一个“@Remote”界面。
  • 从WAR到EAR的EJB-JAR,对远程接口进行JNDI查找。
  • 从EJB-JAR到EJB-JAR,通过“@EJB”进行注入到本地接口。
  • 对于同一个EJB-JAR中的两个服务,通过“@Inject”注入本地接口。
  • 你怎么看待这件事? 这是对的吗?


    正如你所看到的,我已经在服务实现上声明了注解“@Local”,而没有定义本地接口。 这是对的吗?

    在EJB 3.1中,本地接口的要求被降低了。 除非你明确需要它们,否则无需编写它们。

    将一个EJB注入另一个EJB的最佳方式是什么?

    这里写的几件事情:

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

    这使得你的问题的答案分为三部分:

  • 在@EJB上使用@Inject,CDI(a)的概念适用于所有托管的bean(这包括EJB)和(b)是有状态的,因此远优于纯粹的@EJB DI
  • 你确定你需要组件的EJB吗?
  • 查看CDI文档绝对是值得的

  • @Inject注释用于Java Bean(POJO),而@EJB注释用于企业Java Bean。 当一个容器将由@EJB注解提供的ejb注入到另一个bean时,它也控制该ejb的生命周期,为无状态bean执行池化等等(当将要注入的bean未部署时,引用将为空)。 如果使用@Inject注释CDI机制,只需使用new运算符就可以找到并创建一个注入资源的实例(如果将要注入的接口的实现不存在,则引用将为null)。 您可以使用具有@Inject注释的限定符来选择注入接口的不同实现。

    链接地址: http://www.djcxy.com/p/58773.html

    上一篇: @Inject, @EJB, @Local, @Remote, @LocalBean, etc... : confused?

    下一篇: EJB 3.1 Dependency Injection Failed