我可以使用多个名称以类似的方式部署EJB,因为在Spring中可以使用名称别名吗?
答案 0 :(得分:0)
根据EJB 3.0规范:
在宣布时间:
命名强>
注释元素名称定义bean“name”,默认为bean类的非限定名称。 bean名称在包含EJB的模块范围内必须是唯一的。
引用EJB:
<强> beanName 强>
beanName元素通过name元素或部署描述符中的元素指定在@Stateful和@Stateless注释中声明的bean“name”。当多个EJB在应用程序中实现相同的业务接口时,beanName元素最有用:beanName允许开发人员引用特定模块中的特定EJB 。
所以,是的,你可以,但ejb必须打包在不同的模块中,然后通过beanName指向它。
不是春天。 ,可能有各种方法,但这是供应商特定的,不是便携式的。
答案 1 :(得分: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,这些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中的别名不同。而在Spring中,别名只是引用相同实例或实例集的不同名称(取决于范围) - 在EJB中,您需要多次声明EJB。在EJB容器中,这些在实例池等方面成为单独的EJB。
根据您要实现的目标 - 您还可以考虑在引用EJB时覆盖引用的EJB名称(使用描述符beanName
覆盖注释<ejb-link/>
)。更多相关信息:
Choose EJB to be injected without recompiling