(本文是转载其他人的技术文章,觉得说得挺浅显易懂,特借来学习) 

   在前面学习的例子中,只有一个EJB,但是对于一个真实的项目,EJB的数量可以有很多,而且EJB之间也会互相调用,那么在一个EJB里面,如何去调用另一个EJB呢?这正是本节要介绍的内容。 

   新建一个bean  

   Other.java 

   public interface Other { 

      public String sayMe(); 

   } 





   OtherBean.java 

   @Stateless 

   // 不写的话默认是本地接口 

   public class OtherBean implements Other { 

      public String sayMe() { 

        return "other"; 

      } 

   } 





   现在是要在HelloWorldBean里面调用OtherBean里面的sayMe方法。 那么我们在helloworld里面怎么获取otherbean ejb呢?有人可能去想到这种方法: 

   public class HelloWorldBean implements HelloWorld, HelloWorldLocal { 

      private Other other = new OtherBean(); 



      public String sayHello(String name) { 

          return name + "说:你好," + other.sayMe(); 

      } 

   } 





   这种方法是绝对错误的,如果通过这种方法得到的对象,它不是EJB对象,而只是一个简简     单单的Java对象。 

    我们要得到一个EJB对象,我们可以采用两种方法。一种方法是通过JNDI查找,第二种方法是采用依赖注入。那么我们首先学一下通过JNDI查找的方式来得到other
EJB。 

    HelloWorldBean.java 

    @Stateful  //指明这个ejb是无状态的会话bean 

@Remote(HelloWorld.class) //将HelloWorld这个接口指定为远程接口 

@Local(HelloWorld.class) //将HelloWorld这个接口指定为本地接口 



//在这个EJB里面,不单具有本地接口,也有远程接口 

public class HelloWorldBean implements HelloWorld, HelloWorldLocal { 



    public String sayHello(String name) { 

        try { 

            InitialContext ctx = new InitialContext(); 

            Other other = (Other)ctx.lookup("OtherBean/local"); 

            return name + "说:你好," + other.sayMe(); 

        } catch (NamingException e) { 

            e.printStackTrace(); 

        } 

        return null; 

    } 







EJBClient.java 



public class EJBClient { 



    public static void main(String[] args) { 



        try { 

            InitialContext ctx = new InitialContext(); 

            HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); 



            System.out.println(helloworld.sayHello("注入者")); 

        } catch (NamingException e) { 

            System.out.println(e.getMessage()); 

        } 

    } 







除了JNDI查找的方式外,还可以通过依赖注入的方式来得到other
ejb。 



HelloWorldBean.java 

@Stateful  //指明这个ejb是无状态的会话bean 

@Remote(HelloWorld.class) //将HelloWorld这个接口指定为远程接口 

@Local(HelloWorld.class) //将HelloWorld这个接口指定为本地接口 



//在这个EJB里面,不单具有本地接口,也有远程接口 

public class HelloWorldBean implements HelloWorld, HelloWorldLocal { 



    @EJB Other other; //通过这个注解就可以把EJB注入进来 

    public String sayHello(String name) { 

        return name + "说:你好," + other.sayMe(); 

    } 







大家比较一下,采用EJB注解注入other EJB,和采用JNDI查找的方式来得到EJB,在代码量上面显然@EJB注解代码量更少,而且在使用上面比JNDI的方式更优雅一些。 

    那么以后大家在做项目的时候,如果要使用到别的EJB的话,可以采用注解的方式来注入要使用的EJB。 



    @EJB Other other; 这种注入它里面的工作原理是怎样的呢? 

    大概是这样的:EJB容器当解释到类里面的字段当带有@EJB注解的时候,它就会根据这个字段other的类型也就是接口Other去寻找是否有实现了这个接口的EJB,如果寻找到了实现了Other这个接口的EJB,并且只寻找到一个的时候,那么它就会把这个EJB注入进来。 

    那么有同学会问:如果寻找到了两个EJB都实现了Other这个接口,那会出现什么问题呢? 这时候会报一个错,因为它不知道我们需要注入哪一个。 

    那么这时候又可能会有同学会问:是不是没有办法解决这个问题呢? 当然,办法是有的。 

    当出现这种情况的时候,我们就要明确指定我们需要注入的是哪一个EJB。 现在假设Other这个接口被两个EJB实现了,我们要注入的是OtherBean这个EJB,那么我们会这样: 

    @EJB(beanName="OtherBean") Other
other; 通过这种形式就可以明确指定需要注入的EJB了,哪怕Other这个接口已被很多EJB实现了。 



    @EJB这个EJB注解它只能够注入EJB,其它那些资源类型是不能采用这个注解来注入的。那么好比我们现在要使用EJB里面的定时服务,这时候我们就不能使用这个@EJB来注入定时服务了。 

    那么我们应该使用哪些注解呢?应该使用@Resource注解,好比我们要注入定时服务:@Resource TimerService timerService; 注入数据源,也是用@Resource注解

可采用两种方法得到一个EJB对象的更多相关文章

  1. JavaScript两种方法来定义一个函数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. scrapy爬虫提取网页链接的两种方法以及构造HtmlResponse对象的方式

    Response对象的几点说明: Response对象用来描述一个HTTP响应,Response只是一个基类,根据相应的不同有如下子类: TextResponse,HtmlResponse,XmlRe ...

  3. C++类的实例化的两种方法

    C++ 类的实例化有两种方法: 直接定义对象: 先定义一个类:   class A { public: A(); virtual ~A(); ... ... };   类实现略. 用的时候: A a; ...

  4. Oracle中spool命令实现的两种方法比较

    ---恢复内容开始--- 要输出符合要求格式的数据文件只需在select时用字符连接来规范格式.比如有如下表 SQL>; select id,username,password from myu ...

  5. console.log的一个应用 -----用new方法生成一个img对象和document.createElement方法创建一个img对象的区别

    我用两种方法来生成img对象,第一种方法是用new方法,第二种方法是用document.createElement方法. var img1 = new Image(); var img2 = docu ...

  6. Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)

    Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)                                                           ...

  7. ToStringBuilder学习(二):两种方法用法优缺点及一个问题

    研究ApacheCommon源码, 先从一个最简单的开始,即围绕Object类里的toString方法自动化实现的一系列类.         怎么来自动化地实现toString方法, 有两种:反射和手 ...

  8. 设置一个DIV块固定在屏幕中央(两种方法)

    设置一个DIV块固定在屏幕中央(两种方法) 方法一: 对一个div进行以下设置即可实现居中. <style> #a{ position: fixed; top: 0px; left: 0p ...

  9. JMeter接口测试-提取动态列表最后一个值的两种方法

    前言 在用JMeter做接口测试时,我们经常会遇到,一个接口返回一个json串,在这个json串中,某个节点的值是一个列表,而且这个列表的长度是动态变化的.今天我们来学习两种提取动态列表最后一个值的两 ...

随机推荐

  1. csu-1328 近似回文词 和 最长回文字符串

    原博文地址:http://blog.csdn.net/u012773338/article/details/39857997 最长回文子串 描述:输入一个字符串,求出其中最长的回文子串.子串的含义是: ...

  2. vue的单文件组件

    五. 单文件组件 1. .vue文件 .vue文件,称为单文件组件,是Vue.js自定义的一种文件格式,一个.vue文件就是一个单独的组件,在文件内封装了组件相关的代码:html.css.js .vu ...

  3. 谈一谈APP支付失败的处理

    如题今天要描述一个问题是:程序在确认订单时拉起第三方支付,支付失败了,引起的问题. 为了能清楚的描述问题,我把场景复现一下,大家肯定都有过APP购物的体会,大家一定知道有一个按钮叫“确认”或者“结算” ...

  4. ExtPager ,分页

    package cn.edu.hbcf.common.vo; public class ExtPager { private Integer start; private Integer limit; ...

  5. centos7.2 安装 Elasticsearch5.2

    打算上全文检索,就找到了找个产品,开始研究下…… 1.官网地址: https://www.elastic.co/guide/en/elasticsearch/reference/5.2/install ...

  6. css3兼容代码

    1. 渐变:.gradient{ width:300px; height:150px; filter:alpha(opacity=100 finishopacity=50 style=1 startx ...

  7. java需要掌握内容、核心不断更新中

    1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该十分了解UML,尤其是class,object,interaction以及statediagra ...

  8. 【BZOJ】2020: [Usaco2010 Jan]Buying Feed, II (dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2020 和背包差不多 同样滚动数组 f[j]表示当前位置j份食物的最小价值 f[j]=min(f[j- ...

  9. MathType编辑书名号的方法有哪些

    MathType作为一款数学公式编辑器,其功能是非常全面的,大家都知道它可以非常方便的编辑各种数据公式和符号.比如书名号.对于这个符号大家的印象是在文科方面用得比较多,其实在数学领域也是常常会用到的, ...

  10. 图像jpeg压缩

    图像分割 8X8 颜色空间转换RGB->YCbCr 3个8X8的矩阵 离散余弦变换:(Discrete cosine transform),简称DCT. DCT转换后的数组中第一个是一个直线数据 ...