介绍

Enterprise JavaBeans Specification v。3.0引入了简化的,基于注释的API,用于EJB注入和查找。 EJB 3.0现在是POJO,可以使用简单的注释将其注入其他组件(例如EJB和Servlet)。 EJB 3.0是Java EE 6的许多其他基于POJO的规范之一,例如JSR-229“ Java EE平台的上下文和依赖注入” (以前称为“ Web Bean”)。 Java EE从未如此简单!

尽管如此,尽管EJB 3.0注释使程序员摆脱了组装Java EE应用程序和连接其所有组件的复杂性,但是您应该注意一些细微之处。 其中一些(例如“全局JNDI名称”)由Enterprise JavaBeans Specification v。3.1解决 。 同时,在广泛部署Java EE 6应用程序服务器之前,您可能会面临编写依赖于非便携式应用程序服务器特定行为的代码的风险。

更糟的是,使用EJB 本地接口时,您可能会遇到一些问题,该接口应该是您自己的bean的应用程序范围接口。 由于本地业务接口实际上暗含本地方法调用(它们使用传递引用的语义,并且仅限于同一JVM实例),因此在访问应用程序中组件的业务接口时,此类接口是首选。 通常,此用例将构成Java EE应用程序中的大多数EJB调用。

声明一个EJB

根据EJB v。3.0简化的API规范,在声明会话Bean时,可以根据会话Bean类型使用两个注释:

  • @无状态
  • @状态

这两个注释共享两个公共的注释元素: namemappingName

名称

注释元素名称定义了bean的“名称”,并且默认为bean类的非限定名称。 Bean名称在包含EJB的模块范围内必须唯一。

被映射的名字

EJB 3.0规范将mappingName定义为“会话Bean应该映射到的特定于产品的名称”。 通常,应用程序服务器使用maptedName将会话Bean映射到全局 JNDI名称。 EJB 3.1规范不赞成使用mappingName元素, 而是引入了“便携式全局JNDI名称”的概念。

我们将很快看到如何以及何时使用此类元数据。

EJB参考

要建立对EJB的引用,可以使用@EJB批注或标准部署描述符(通过<ejb-ref />和<ejb-local-ref />)。 @EJB注释定义如下:

@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface EJB {String name() default "";Class beanInterface() default Object.class;String beanName() default "";String mappedName() default "";String description() default "";
}

名称

name元素在“应用程序环境”中定义注入的EJB 名称 。 因此,EJB 名称是注入的对象在私有名称空间java:comp / env中的位置 。 它的默认值是带注释的类字段或属性的全限定名称。 在类级别使用@EJB注释时, 名称元素是必需的。

name元素与部署描述符中的<ejb-ref-name />元素等效:

<ejb-ref><ejb-ref-name>bean name</ejb-ref-name>[...]
</ejb-ref>

bean接口

beanInterface是注入的组件的业务接口类型。 默认情况下,它是带注释的字段或属性的类型。 在类级别使用@EJB批注时, beanInterface元素是必需的。

beanInterface元素等效于部署描述符中的<remote />或<local />元素:

<ejb-ref><ejb-ref-name>bean name</ejb-ref-name><remote>bean interface</remote>[...]
</ejb-ref>

bean名称

beanName元素指定通过name元素在@Stateful@Stateless批注中声明的bean,或通过<ejb-name />元素在部署描述符中声明的bean“ name”。 当一个以上的EJB在应用程序中实现相同的业务接口时, beanName元素最有用:beanName使开发人员可以在特定模块中引用特定EJB。 在这种情况下使用的语法是:

<ejb module>#<ejb name>

如果在应用程序中只有一个EJB实现所请求的业务接口,那么将自动解析Bean名称。

beanName元素等效于部署描述符中的<ejb-link />元素:

<ejb-ref><ejb-ref-name>bean name</ejb-ref-name><remote>bean interface</remote><ejb-link>linked ejb</ejb-link>[...]
</ejb-ref>

被映射的名字

@Stateless@Stateful批注的maptedName元素一样, mappedName是特定于产品的元数据,其使用不可移植。

mappingName元素与部署描述符中的<mapped-name />元素等效:

<ejb-ref><ejb-ref-name>bean name</ejb-ref-name><remote>bean interface</remote><ejb-link>linked ejb</ejb-link><mapped-name>mapped name</mapped-name>[...]
</ejb-ref>

那么其他应用程序中的Bean呢?

如果回顾到目前为止描述的机制,您应该注意到,没有(便携式)方法可以声明对应用程序外部bean的依赖关系(EJB引用)。 EJB规范3.1版解决了这个问题,并定义了可移植的全局JNDI名称 。 无需为在兼容的EJB v。3.1容器中为兼容的EJB v。3.0分配可移植的全局JNDI名称进行更改。

同时,要在应用程序外部连接对EJB的引用,您应该依赖于应用程序服务器提供的机制。

不要依靠不可移植的全局JNDI名称来查找EJB

如前几节所述,在EJB v。3.1之前,尚没有可移植的方式来查找具有全局JNDI名称的EJB,并且部署者必须依赖于应用程序服务器特定的工具和元数据来在EJB引用和EJB之间建立链接。全球JNDI名称。 此外,当在应用程序外部建立对Bean的引用时,这样的链接是必需的。

即使避免使用@EJB注释元素(或其对应的部署描述符元素)并使用全局JNDI名称很吸引人,您也应始终依赖EJB引用并在java:comp / env私有名称空间中进行查找。 您的私有名称空间和映射机制为您提供了将代码与配置更改隔离开的间接级别。

这也意味着,如果仅限于EJB v。3.0,则应始终使用beanName(<ejb-link />)机制并在私有java:comp / env命名空间中执行查找。 很多时候,我听说过一些开发人员检查应用程序服务器的全局JNDI树以推断出EJB的应用程序服务器全局JNDI命名方案,然后到处都遇到NamingException的故事。 出于这个原因,避免使用@EJB mappedName元素,依靠名称和beanName代替。

例如,某些应用程序服务器使用全局JNDI名称发布远程和本地EJB业务接口。 其他人根本没有。 Oracle WebLogic是后者之一。 在EJB 3.0版规范,事实上, 并不需要一个本地业务接口在全局JNDI树可用。

查找远程和本地业务接口

就呼叫者而言,获取对远程和本地业务接口的引用的过程应相同。 不幸的是,如果您不仅仅依赖于可移植的机制,情况并非总是如此。

始终可以使用beanName机制来解析对EJB本地接口的引用。 引用远程接口并非总是如此,因为此类EJB可能位于应用程序外部。 那么,这就是不依赖代码中全局JNDI名称的另一个原因:不仅这样的代码不能移植,而且还需要您使用不同的策略来查找远程和本地业务接口(取决于应用程序服务器)。 )业务接口类型将不是透明的,并且业务接口类型的更改可能会破坏您的代码。

建立EJB引用的简单模式

尽管它们在某些情况下可能是必需的,但应避免EJB查找,并依赖@EJB引用“自动装配 ”。 尊重一些简单的模式可以确保以完全自动的方式声明和满足您的EJB引用:

  • 尝试减少共享业务接口的EJB的数量 :如果只有一个EJB在应用程序中实现特定的业务接口,则可以自动声明EJB引用并使用默认的@EJB注释进行绑定
  • 如果共享业务接口改善了您的应用程序设计,请为应用程序的bean定义明确的命名策略并避免重复 :如果只有一个具有特定名称的bean,则可以自动声明EJB引用并使用@EJB(beanName =” [name]”)注释。 如果有多个同名bean,则在声明引用时将被迫使用@EJB(beanName =” [ejb-module-path]#[ejb-name]”)语法。
  • 如果需要以编程方式查找EJB引用,请使用@EJB name元素(或<ejb-ref-name />元素)为本地名称空间中的EJB声明一个位置,然后使用@EJB beanName将其链接到目标EJB。元素(或<ejb-link />元素。)

参考: The Gray Blog上的JCG合作伙伴 Gray 介绍了EJB 3.0注入和查找简介 。

相关文章 :
  • 基本的EJB参考,注入和查找
  • EJB程序化查找
  • 使用Oracle WebLogic对应用程序外部的EJB的引用
  • EJB 3.1全局JNDI访问
  • GWT EJB3 Maven JBoss 5.1集成教程
  • Java泛型快速教程
  • JVM如何处理锁

翻译自: https://www.javacodegeeks.com/2011/08/introduction-to-ejb-30-injection-and.html

EJB 3.0注入和查找简介相关推荐

  1. ejb 2.0 3.0_EJB 3.0注入和查找简介

    ejb 2.0 3.0 介绍 Enterprise JavaBeans Specification v.3.0引入了简化的,基于注释的API,用于EJB注入和查找. EJB 3.0现在是POJO,可以 ...

  2. sql注入查找注入点_基本的EJB参考,注入和查找

    sql注入查找注入点 在本系列的第一部分中 ,我们介绍了Enterprise JavaBeans v.3.0规范提供的机制,用于定义EJB组件,声明对EJB的引用并通过依赖项注入或程序化JNDI查找将 ...

  3. 基本的EJB参考,注入和查找

    在本系列的第一部分中 ,我们介绍了Enterprise JavaBeans v.3.0规范提供的机制,用于定义EJB组件,声明对EJB的引用并通过依赖项注入或程序化JNDI查找将它们连接起来. 在此博 ...

  4. ejb运行程序_EJB程序化查找

    ejb运行程序 在上一篇文章中,我们了解了EJB 引用和EJB 注入 . 尽管EJB注入是一种强大的容器工具,可以简化模块化应用程序的开发,但有时还是希望执行程序化EJB查找. 例如,让我们假设一组不 ...

  5. ejb 2.0 3.0_EJB 3.1全局JNDI访问

    ejb 2.0 3.0 如本系列前面部分所述,EJB 3.0版规范的主要缺点是缺少可移植的全局JNDI名称. 这意味着没有可移植的方式将EJB引用链接到应用程序外部的Bean. EJB v.3.1规范 ...

  6. ejb 2.0 3.0_Java EE 6测试第I部分– EJB 3.1可嵌入API

    ejb 2.0 3.0 我们从Enterprise JavaBeans开发人员那里听到的最常见的请求之一就是需要改进的单元/集成测试支持. EJB 3.1规范引入了EJB 3.1可嵌入API,用于在J ...

  7. 为什么我喜欢EJB 3.0并且尤其喜欢EJB 3.1

    http://developer.51cto.com/art/200906/127156.htm Marc Fleury在2002年写了一篇值得一读的文章 蓝皮书 "为什么我爱EJB&quo ...

  8. Hubble.Net 0.1 版本算法简介

    Hubble.Net 0.1 版本算法简介 Eaglet     经过3周的开发,Hubble.Net 0.1 版本已经完成.这个版本不是一个可以商业应用的版本,准确的说其只完成了一些最核心的算法.发 ...

  9. Swift3.0语言教程查找字符集和子字符串

    Swift3.0语言教程查找字符集和子字符串 Swift3.0语言教程查找字符集和子字符串,在字符串中当字符内容很多时,我们就需要使用到查找字符集或者子字符串的方法.以下我们将讲解3种查找字符集和子字 ...

最新文章

  1. 20个有用的jq弹窗
  2. Hadoop学习总结
  3. WGAN的成功,可能跟Wasserstein距离没啥关系
  4. Redis通讯协议RESP详解
  5. 13款WordPress使用必装插件
  6. MySql 中的=操作符
  7. 如何用手机NFC代替小区门禁?
  8. flexgdsgen
  9. 硬件信息修改工具 支持修改机器码 硬盘 MAC 等信息
  10. 服务器lsass系统错误,lsass.exe系统错误解决教程
  11. 关于苹果侵权邮件反馈邮件范文
  12. 驾照科二科三训练总结
  13. Win10指定用户访问共享文件及“无法访问。你可能没有权限使用网络资源。”问题解决
  14. 入门全栈Java程序员——CSS
  15. 国家医保移动支付国密算法SM2签名验签、SM4加解密测试工具
  16. 石像鬼 openwrt chinadns dns-forwarder 开机无法自动启动
  17. java能否构成三角形_java中判断三个参数是否能构成三角形的方法
  18. 基于Unity的VR迷宫游戏项目技术分享
  19. scrcpy设置快捷键_Scrcpy投屏控制器下载|Scrcpy(安卓手机投屏神器)附使用教程 v1.16官方版...
  20. Spring Cloud 高并发优化流程

热门文章

  1. Invalid bound statement (not found):出现的原因和解决方法
  2. java流式传输对象_Java性能:面向教学与流式传输
  3. java中的lombok_如何在Java中使用Lombok删除样板设置器吸气剂
  4. hibernate删除记录_Hibernate记录:常见问题的提示和解决方案
  5. eclipse neon_在自定义Java 9映像上运行Eclipse Neon
  6. 函数指针使用场景和选择_在N + 1场景中使用@NamedEntityGraph更有选择地加载JPA实体...
  7. 将Java类作为子进程运行
  8. rest spring_Spring REST:异常处理卷。 1个
  9. 掌握Java 11的Constantdynamic
  10. java中方法的命名_Java方法中的参数太多,第5部分:方法命名