首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-06-27 
通过注解方式注入并使用其他EJB或者服务如何在一个EJB中去调用另一个EJB?要得到EJB对象有两种方式:1.通过J

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

热点排行