2011-07-31 147 views
3

我的用例需要我有一個類層次結構如下圖所示兩個具有相同接口的EJB。這是一個好習慣嗎?

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. 您是否在課堂設計/層次結構中看到其他任何缺點?

注:我的應用服務器是Weblogic的

感謝

回答

5

EJB只是一種特殊的類。這是特別的,因爲它的生命週期是由容器管理的。它只是一個類,因爲它是用java編寫的,並且可以實現它想要的任何接口和任何業務邏輯。

所以,我認爲這是一個很好的做法,有幾個相同的接口實現。它允許將特定服務的實現與其使用分開。例如,您可以創建可以發送一些內容和2個實現的界面Sender:EmailSender和SmsSender。兩者都實現相同的接口,都是EJB。

唯一的問題是,在這種情況下,您不能僅通過接口綁定對發件人的引用,但必須像使用mappedName一樣。

2
  1. 我看不出有任何技術問題,以此爲你的EJB的2定義不同的名稱,應該工作...
  2. 我不明白你的具體要求,所以我可能是錯的:如果服務接口在AbstractClass中實現並且沒有在其中一個EJB中重寫,那麼使用一個單獨的EJB實現似乎是實用的10。其次,我沒有爲同一接口getMetaValue提供2種不同的EJB實現,而是讓接口參數化並讓EJB決定是否要實現new MetaValue(x, y)new MetaValue(a, b),例如, abstract public MetaValue getMetaValue(SomeParameter param);
相關問題