我是EJB概念的新手。我在不同的网站上看过以下内容:
样本1:
@Stateless
@EJB(name="audit", beanInterface=AnotherEJBLocal.class)
public class EmployeeBean implements EmployeeServiceLocal, EmployeeServiceRemote {
@PersistenceContext(unitName = "EmployeeService")
private EntityManager manager;
public void doAction(){
try {
Context ctx = new InitialContext();
AnotherEJBLocal audit = (AnotherEJBLocal) ctx.lookup("java:comp/env/audit");
audit.doAnother();
} catch (NamingException e) {
throw new EJBException(e);
}
}
}
样本2:
public static void main(String[] a) throws Exception {
EmployeeServiceRemote service = null;
service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeBean/remote");
service.doAction();
}
样本3:
obj = ctx.lookup(ejb/CBDWebAppEAR/CBDWebApp.jar/<EJB name>/<Remote Interface Class Name>);
CBDWebApp是bean所在的项目名称。
我的问题是:
有什么需要&amp; java的含义:comp / env / audit
为什么在样本2的情况下不使用相同类型的字符串。我猜是 它是一个远程EJB而不是本地的。
为什么EJB的含义在示例3中查找字符串。
答案 0 :(得分:0)
java:comp/env/audit
字符串正在查找@EJB(name="audit", beanInterface=AnotherEJBLocal.class)
之前声明的EJB引用。 @EJB(以及@Resource和所有其他EE引用)声明的名称在java:comp/env
上下文中隐式声明。通过此参考,部署人员可以重新调整&#34;审计&#34;引用实现AnotherEJBLocal接口的应用程序中的任何EJB,或者如果部署者没有指定任何内容,则@EJB批注的javadoc要求它在实现接口的同一应用程序中定位单个EJB。
这个主要方法(可能)由独立的Java程序声明。在这种情况下,它(可能)通过系统属性进行配置,以连接应用程序服务器的JNDI服务器,该服务器将远程引用返回给客户端。查找的名称是特定于供应商的,并且可能是在部署期间为EJB配置的。
这与#2非常相似,唯一的区别是正在使用的特定字符串。在这种情况下,它可能依赖于应用程序服务器&#34;默认&#34;绑定名称(如果在部署期间未使用模式ejb/<app>/<module>/<bean>/<interface>
为EJB配置。