如何在一个EJB中去调用另一个EJB?
要得到EJB对象有两种方式:
1.通过JNDI查找
2.通过依赖注入
通过JNDI得到本地接口的代理,通过代理,调用ejb方法:
新建Other接口:
------------------------------------------
package com.jboss.ejb3;
public interface Other {
public String sayMe();
}
新建Other接口的实现bean(OtherBean):
------------------------------------------
package com.jboss.ejb3.impl;
import javax.ejb.Stateless;
import com.jboss.ejb3.Other;
@Stateless //无状态bean
//如果不指定接口,默认本地接口
public class OtherBean implements Other {
@Override
public String sayMe() {
return "Other";
}
}
在另一个EJB中想调用刚才EJB的方法时:
如果用private Other other = new OtherBean();
则只是声明了一个普通的java类,而不是EJB类
运行结果: 注入者说:你好,Other
--------------------------------------------------
通过EJB注解依赖注入:
之后,通过ANT部署,再用客户端调用,也可以输出 注入者说:你好,Other
比较:
通过EJB注解注入Other EJB类 比 通过JNDI查找得到Other EJB类
代码量更少,在使用时比JNDI更优雅
注入原理:
当容器解析到 Other other这段代码,前面带有@EJB注解时
就会去查找 实现了Other类型的EJB实现类
当寻找到了实现类,且只寻找到了一个时,它就会把这个EJB类给注入进来
如果寻找到了多个实现类,就会报异常,因为它不知道要用哪个实现类
当出现这种情况时,需要指定要注入的是哪个EJB:
在@EJB(beanName="") Other other; //beanName属性明确指定要EJB类的名称
通常EJB类名称是简单类名称(不带包名)
可以通过
@Stateless(name="xxx") //无状态bean它的EJB类名称是: xxx
@Stateful(name="xxx") //修改有状态bean的EJB类名称
为EJB类指定名称(通常不这么做)
那么此时已经知道OtherBean实现了Other接口,
指定@EJB(beanName="OtherBean") Other other;
@EJB注解只能注入EJB 其他资源类型不能使用@EJB注解注入
好比使用EJB里面的定时服务使用@Resource注解
@Resource TimerService timerService;
定时服务属于EJB3中已知定义好的服务,直接注入进来即可
注入数据源:
@Resource(mappedName="jndiName...") DataSource dataSource;
mappedName属性用来指定数据源的JNDI名称
通常在JBOSS中,JNDI名称都是java:xxx开头