2013-10-09 80 views

回答

0

根據EJB 3.0規範:

在聲明時間:

名稱

註釋元素名稱定義了豆「名」,缺省值爲bean類的非限定名稱。在包含EJB的模塊的範圍內,bean名稱必須是唯一的。

引用一個EJB:

beanName

的beanName元素指定爲通過name元素或部署描述符,通過部件的@Stateful和@Stateless註解聲明豆「名」 。當一個以上的EJB在應用程序中實現相同的業務接口時,beanName元素是最有用的:beanName允許開發人員引用特定模塊中的特定EJB。

所以,你可以,但ejb必須打包在不同的模塊中,然後通過beanName指向它。

不是春天。,可能有辦法,但這是供應商特定的,不便攜式。

0

是的,可以在多個名稱或使用ejb-jar.xml描述符的別名下部署相同的EJB。

此外,EJB xml描述符中定義的名稱和註釋中定義的名稱都將被考慮在內(儘管爲了便攜性的原因,我不會在xml描述符和註釋之間混合)。

本例將在JBoss AS 7.1.1.Final:

@Local 
public interface PingWorker { 
    String ping(String name); 
} 

@Stateless(name = "PingAlias") // first name 
public class PingWorkerBean implements PingWorker { 
    @Override 
    public String ping(String name) { 
     return "Hello " + name; 
    } 
} 

<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> 
    <enterprise-beans> 
     <session> 
      <ejb-name>PingWorker</ejb-name> <!-- second name --> 
      <ejb-class>com.xyz.service.PingWorkerBean</ejb-class> 
      <session-type>Stateless</session-type> 
     </session> 
     <session> 
      <ejb-name>PingProcessor</ejb-name> <!-- third name --> 
      <ejb-class>com.xyz.service.PingWorkerBean</ejb-class> 
      <session-type>Stateless</session-type> 
     </session> 
    </enterprise-beans> 
</ejb-jar> 

在參照組件可以聲明:

@Stateless 
public class PingBean implements Ping { 

    @EJB(beanName = "PingAlias") 
    private PingWorker pingWorkerByAnnotaion; 

    @EJB(beanName = "PingWorker") 
    private PingWorker pingWorkerByDescriptorOne; 

    @EJB(beanName = "PingProcessor") 
    private PingWorker pingWorkerByDescriptorTwo; 

} 

,所有三個參考應該是滿意的。在部署有部署了三個EJB的哪些公開相同的接口和實現,但不同的名稱:

java:global/ear-app-1/ejb-1/PingProcessor!com.xyz.service.PingWorker 
java:app/ejb-1/PingProcessor!com.xyz.service.PingWorker 
java:module/PingProcessor!com.xyz.service.PingWorker 
java:global/ear-app-1/ejb-1/PingProcessor 
java:app/ejb-1/PingProcessor 
java:module/PingProcessor 

java:global/ear-app-1/ejb-1/PingAlias!com.xyz.service.PingWorker 
java:app/ejb-1/PingAlias!com.xyz.service.PingWorker 
java:module/PingAlias!com.xyz.service.PingWorker 
java:global/ear-app-1/ejb-1/PingAlias 
java:app/ejb-1/PingAlias 
java:module/PingAlias 

java:global/ear-app-1/ejb-1/PingWorker!com.xyz.service.PingWorker 
java:app/ejb-1/PingWorker!com.xyz.service.PingWorker 
java:module/PingWorker!com.xyz.service.PingWorker 
java:global/ear-app-1/ejb-1/PingWorker 
java:app/ejb-1/PingWorker 
java:module/PingWorker 

正如你可能會看到這個作品不同於春季別名。在Spring別名中,只有不同的名稱引用同一個實例或實例集合(取決於範圍) - 在EJB中,您需要多次聲明EJB。在EJB容器中,它們根據實例池等變成獨立的EJB。

根據您試圖實現的內容 - 您也可以考慮在引用EJB時​​覆蓋引用的EJB名稱(替代描述符爲<ejb-link/>的註釋beanName)。更多關於這裏: Choose EJB to be injected without recompiling

相關問題