`

ejb @Inject注释

    博客分类:
  • ebj
ejb 
阅读更多

(本文是转载其他人的技术文章,觉得说得挺浅显易懂,特借来学习)
   在前面学习的例子中,只有一个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注解

分享到:
评论

相关推荐

    Manning - Bitter EJB @2003.pdf

    《Manning - Bitter EJB @2003.pdf》一书是关于EJB(Enterprise JavaBeans)技术的深入探讨,由Bruce Tate、Mike Clark、Bob Lee、Patrick Linkey等作者编写,Manning出版社出版。这本书针对的是2003年的EJB标准,即...

    Ejb3中的注释常用属性

    其中,@EJB注释是用于依赖注入(Dependency Injection)的关键元素,使得开发者能够直接在类中声明并注入EJB组件,而无需手动查找和管理它们。下面我们将详细探讨@EJB注释的常用属性及其用法。 1. **@EJB注释的属性...

    EJB 注释精解(pdf版)

    ### EJB注释精解 #### 一、EJB注释概述 EJB(Enterprise JavaBeans)是Java EE平台的一部分,用于开发企业级应用程序。EJB注释是EJB3.0引入的一个重要特性,它简化了EJB的配置过程,并使代码更易于理解和维护。本...

    Local和Remote方式访问EJB

    EJB(Enterprise JavaBeans)是Java企业级应用开发的核心组件之一,主要用于构建可复用、安全和事务处理的服务器端应用程序。本主题将探讨“Local”和“Remote”两种方式访问EJB的知识点。 首先,我们要理解EJB的两...

    EJB中的注释.pdf

    ### EJB中的注释知识点详解 #### 一、EJB注解概述 EJB(Enterprise JavaBeans)是一种Java EE服务器端应用模型,用于构建可移植的企业级应用。EJB 3.0引入了大量的注解(annotation),使得开发变得更加简单直观。...

    个人整理的EJB3中的注释

    - `@EJB`注释用于在组件中注入EJB服务。它允许你通过指定beanName或mappedName来引用EJB。例如: ```java @EJB(beanName="A") IA a; ``` - 如果只有一个实现类,通常可以省略beanName。`mappedName`属性用于...

    ejb3 第8讲 --通过注解方式注入并使用其他EJB或者服务

    EJB 3通过注解实现依赖注入,例如`@EJB`、`@Inject`等,使得开发者可以轻松地将一个EJB实例注入到另一个EJB或服务中,增强了代码的可读性和可维护性。 让我们详细了解一下`@EJB`注解的用法。在EJB 3中,`@EJB`注解...

    EJB_transaction(EJB事物)

    EJB事物详细讲解:TransactionAttributeType.MANDATORY;TransactionAttributeType.REQUIRED;TransactionAttributeType.REQUIRES_NEW;TransactionAttributeType.SUPPORTS;TransactionAttributeType.NOT_SUPPORTED...

    ejb3.0入门图文教程

    1. **注解驱动的配置**:EJB 3.0引入了大量的注解,如`@Stateless`、`@Stateful`、`@MessageDriven`、`@PersistenceContext`和`@Inject`等,这些注解替代了EJB 2.x中的XML配置文件,使得代码更加简洁、易读。...

    JavaEE5.0.zip_JavaEE5_injection in java_javaEE5.0_javaee5.0 下载

    Java EE 5.0中实现依赖注入的方式主要有两种:JSR-250规范的`@Resource`注解和JSR-330规范的`@Inject`注解。`@Resource`注解主要用于资源注入,如数据库连接池、JMS队列等,而`@Inject`注解则用于一般的依赖注入。 ...

    EJB.rar_EJB3_EJB3.0_ejb

    依赖注入(DI)是EJB 3.0的另一个重要特性,它允许通过`@EJB`、`@Inject`或`@Resource`注解在不需手动创建对象的情况下,将依赖项注入到bean中。这提高了代码的可测试性和可维护性。 ### 5. 容器管理事务 EJB 3.0...

    EJB 官方文档 参考

    依赖注入通过@EJB、@Inject等注解实现,允许组件之间松耦合,提高代码的可测试性和可维护性。 学习这份官方文档,开发者能够掌握如何设计和实现符合EJB 3.0规范的组件,理解如何利用EJB的强大功能来构建健壮的企业...

    EJB3 入门经典 源码

    3. **依赖注入(Dependency Injection)**:EJB3支持JSR 330标准的依赖注入,如`@Inject`和`@EJB`注解,使得组件之间的依赖关系可以通过容器自动管理,减少了代码的耦合度。 4. **无状态会话bean(Stateless ...

    大量EJB3文档(基本包含EJB所有技术资料)

    5. **依赖注入(Dependency Injection, DI)**:EJB3引入了JSR-250规范,通过@EJB、@Inject和@Resource等注解,实现了组件间的依赖关系管理,无需手动管理对象实例。 6. **事务管理**:EJB3提供了声明式事务管理,...

    ejb3 带源码

    - **依赖注入(Dependency Injection)**:通过@EJB、@Inject等注解实现,简化了组件间的依赖关系管理。 - **简化的企业Bean接口**:无接口的会话Bean和实体Bean允许直接使用pojo类,降低了复杂性。 3. **EJB3的...

    EJB3规范 简体中文

    EJB3 引入了许多注释符来定义和配置不同的 EJB 组件,这些注释符可以显著减少 XML 配置的需求,并使代码更加简洁易读。 ##### 3.1 特定类型 Bean 的注释符 这些注释符用于标识不同类型的 EJB 组件,如无状态会话 ...

    2022年EJB 3.0开发指南之依赖注入Java教程.docx

    对于单例的成员,例如`SessionContext`、`TimerService`、`UserTransaction`和`EntityManager`,可以直接使用`@Inject`注解,无需指定其他属性。 此外,`@Resources`注解可以用于在一个类级别上注入多个资源,其`...

    EJB学习大全(EJB3.0实例教程 JPA教程 实战EJB)

    4. **依赖注入(Dependency Injection)**:通过`@EJB`,`@Inject`等注解实现Bean之间的依赖关系,简化了配置。 5. **持久化框架(Persistence Framework)**:EJB3.0引入了JPA(Java Persistence API),提供了一...

    ejb培训笔记和源代码

    7. **依赖注入**:讲解EJB 3.x引入的依赖注入(DI)和注解配置,如`@EJB`, `@Inject`, `@PersistenceContext`, `@Resource`等。 8. **远程接口和本地接口**:讨论如何定义和使用EJB的远程接口和本地接口,以便于...

    EJB3.0规范-EJB3.0 SPECIFICATION

    7. **依赖注入(Dependency Injection, DI)**:EJB3.0引入了JSR-299(后来成为CDI,Contexts and Dependency Injection)的早期形式,允许通过`@Inject`注解实现依赖的自动装配。 8. **查询语言(JPQL)**:Java ...

Global site tag (gtag.js) - Google Analytics