【问题标题】:EJB3 instantiationEJB3 实例化
【发布时间】:2011-04-27 22:02:49
【问题描述】:

我有一些可能是微不足道的问题。

如果我定义了 EJB3+ 接口,可以说它是远程的:

@Remote
public class FooServiceRemote {
   void foo();
}

和一个实现

@Stateless
public class FooService implements FooServiceRemote {
   void foo() { ... }
}

如果应用服务器只知道接口上的依赖注入的@EJB注解,默认情况下如何解析使用什么实现(并通过代理调用):

public class SomeClass {
   @EJB
   private FooServiceRemote fooService;
}

它是通过反射完成的(接口名称的缩写)吗?或者他扫描这种接口的可能实现,选择一个。或者.. ?如果我想创建一个接口的更多实现,是否可以以及如何指定应该实例化的实现(也许可以通过注释的某些参数)。

谢谢:-)

【问题讨论】:

    标签: java ejb-3.0 ejb


    【解决方案1】:

    在极少数情况下,您需要让两个 bean 实现相同的接口(这不是一个好的做法),您可以命名它们并按名称选择您想要的。

    @Stateless(name="FooService1")
    public class FooService1 implements FooService { }
    
    @Stateless(name="FooService2")
    public class FooService2 implements FooService { }
    
    public class SomeClass {
       @EJB(beanName="FooService1") 
       private FooService fooService;
    }
    

    其他可能的方法是使用 JNDI 或 mappedName 属性进行查找。 在此处查看 EJB 注释的 javadoc:http://download.oracle.com/javaee/6/api/javax/ejb/EJB.html

    【讨论】:

    • 是的,这大概就是我想要的。你认为拥有更多相同接口的实现不是一个好习惯吗?:)
    • 让我想象一下。你有一些数据库访问权限。这次您使用 JPA。您定义 EJB 接口,该接口具有 saveObject(MyObj obj) 等方法。随着进化的新方法的出现,可以说这种方法就像键值对数据库(顺便说一句又回到了时尚),所以你不想使用你的 JPA impl。但是删除它会很遗憾。所以你做一个新的实现并切换它。
    • 我没有看到很多使用该功能的理由。我的意思是,也许您正在用性能更高的服务实现替换服务实现,并且需要同时运行一段时间。尽管如此,从架构的角度来看,像每个接口的多个实现和 EJB 多态这样的事情对我来说看起来并不合适(或者我可能只是变得老了和生锈了哈哈)。
    • 我也感觉到了。这闻起来……不好。但是,当想象我的例子时。没有真正好的理由简单地删除旧的实现。或者有吗?:-)
    • 我明白你的意思,但正如我所说,我的老派方法是使用不同的 ejb jar,比如 persistence-jpa.jar 和 persistence-google-datastore.jar,而且,从不,曾经同时运行两者(所以,我想也许一个服务的两个实现都可以,但我会以一种服务可插入的方式做到这一点,而无需客户端代码指定哪一个)。
    【解决方案2】:

    只是一个修复,

    @Remote
    interface FooServiceRemote {
       void foo();
    }
    
    @Stateless
    public class FooService implements FooServiceRemote {
       void foo() { ... }
    }
    

    这样,应用服务器就知道哪些类实现了指定的接口。

    如果你有两个类,你必须指定你需要哪个类。

    【讨论】:

    • 好的,谢谢,我忘记了,更新了帖子。但是如何指定我需要实例化的类呢?
    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多