通过注解方式注入并使用其他EJB或者服务

如何在一个EJB中去调用另一个EJB?

要得到EJB对象有两种方式:
1.通过JNDI查找
2.通过依赖注入


通过JNDI得到本地接口的代理,通过代理,调用ejb方法:

通过注解方式注入并使用其他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类

通过注解方式注入并使用其他EJB或者服务
运行ANT部署后,调用客户端

通过注解方式注入并使用其他EJB或者服务

运行结果: 注入者说:你好,Other
--------------------------------------------------

 

通过EJB注解依赖注入:

通过注解方式注入并使用其他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开头

你可能感兴趣的:(ejb)