两个具有相同接口的EJB。这是一个好习惯吗?

时间:2011-07-31 08:25:21

标签: java oop ejb-3.0

我的用例要求我有一个类层次结构,如下所示

public interface ServiceA{ public void doSomething();}


public abstract class AbstractClass implements ServiceA{

     @Override
     public void doSomething(){
        getMetaValue();        
        .. do common Things applicable to all EJBS...
     }

     public abstract MeataValue getMetaValue();
}

@Stateless(mappedName="EJBBeanImlJ")
public EJBBeanImplJ extends AbstractClass{
   public MetaValue getMetaValue(){
      return new MetaValue(x, y);
   }
}

@Stateless(mappedName="EJBBeanImplK")
public EJBBeanImplK extends AbstractClass{

   public MetaValue getMetaValue(){
       return new MetaValue(a,b);
   }
}

问题:

  1. 为两个EJB实现提供相同的接口是一个很好的EJB实践吗?

  2. 您是否在班级设计/等级制度中看到任何其他缺点?

  3. 注意:我的appserver是Weblogic

    谢谢

2 个答案:

答案 0 :(得分:5)

EJB只是一种特殊的类。它很特殊,因为它的生命周期由容器管理。它只是一个类,因为它是用java编写的,可以实现它想要的任何接口和任何业务逻辑。

所以,我认为拥有相同界面的多个实现是一个好习惯。它允许将特定服务的实现与其使用分开。例如,您可以创建可以发送一些内容和2个实现的接口Sender:EmailSender和SmsSender。两者都实现相同的接口,都是EJB。

唯一的问题是,在这种情况下,您不能仅通过其接口绑定对发件人的引用,但必须像您一样使用mappedName

答案 1 :(得分:2)

  1. 我没有看到任何技术问题,因为您为2个EJB定义了不同的名称,应该有效......
  2. 我不明白你的具体要求,所以我可能错了:如果服务接口是在AbstractClass中实现的,而不是在其中一个EJB中被覆盖,那么实现一个单独的EJB似乎是切实可行的{ {1}}。其次,我不是为同一个接口ServiceA提供2个不同的EJB实现,而是让接口参数化,让EJB决定是否要实现getMetaValuenew MetaValue(x, y),例如new MetaValue(a, b)