我的用例要求我有一个类层次结构,如下所示
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);
}
}
问题:
为两个EJB实现提供相同的接口是一个很好的EJB实践吗?
您是否在班级设计/等级制度中看到任何其他缺点?
注意:我的appserver是Weblogic
谢谢
答案 0 :(得分:5)
EJB只是一种特殊的类。它很特殊,因为它的生命周期由容器管理。它只是一个类,因为它是用java编写的,可以实现它想要的任何接口和任何业务逻辑。
所以,我认为拥有相同界面的多个实现是一个好习惯。它允许将特定服务的实现与其使用分开。例如,您可以创建可以发送一些内容和2个实现的接口Sender
:EmailSender和SmsSender。两者都实现相同的接口,都是EJB。
唯一的问题是,在这种情况下,您不能仅通过其接口绑定对发件人的引用,但必须像您一样使用mappedName
。
答案 1 :(得分:2)
AbstractClass
中实现的,而不是在其中一个EJB中被覆盖,那么实现一个单独的EJB似乎是切实可行的{ {1}}。其次,我不是为同一个接口ServiceA
提供2个不同的EJB实现,而是让接口参数化,让EJB决定是否要实现getMetaValue
或new MetaValue(x, y)
,例如new MetaValue(a, b)