ejb 2.0 3.0

介绍

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。 当一个以上的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 2.0 3.0

ejb 2.0 3.0_EJB 3.0注入和查找简介相关推荐

  1. EJB 3.0注入和查找简介

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

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

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

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

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

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

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

  5. 避免在 ASP.NET Core 3.0 中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0 类库转换为.NET Core 3.0 类库 Part 2 - IHostin ...

  6. 看完后完全了解 Vue 2.0 和 Vue 3.0 的区别

    1.数据的双向绑定 Vue2.0使用Object.defineProperty 原理:通过使用 Object.defineProperty 来劫持对象属性的 geter 和 seter 操作,当数据发 ...

  7. web3.0 升级到webpack5.0 以及兼容IE处理

    如果你的事vue-cli  或者其他cli 关于IE 兼容不具有什么参考价值.如果是react 项目,你看看就行. webpack3的打包速度已成为诟病,所以我们将原来的webpack3升级至webp ...

  8. 从DXN V1.0到DXN V2.0,联想凌拓升级的不仅仅是产品

    2021年3月,全自研联想ThinkSystem DXN企业级分布式存储系统首次发布,2022年4月,发布ThinkSystem DXN V2.0版本.这就是联想凌拓的速度. 三年来,联想凌拓一直专注 ...

  9. Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)

    Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项 参考:https://blog.csdn.net/weixin_40475396/article/detail ...

最新文章

  1. Gecko浏览器引擎
  2. javascript 之数据类型--01
  3. 第二节:思维导图学习Shell脚本编程之命令之美
  4. 基于Hadoop的Spark超快安装
  5. WebStrom如何设置字体?
  6. ABAP string函数一览
  7. java怎么安装_Windows、Linux、Mac下安装JDK
  8. 看懂Oracle执行计划(转载)
  9. c语言编写计算器保存结果的程序,c语言编写计算器程序.doc
  10. input框保持两位小数
  11. php mysql表单源码_PHP表单数据写入MySQL数据库的代码
  12. 【转】XP下OpenProcess( PROCESS_ALL_ACCESS...失败
  13. Duplicate keys detected: ‘checks‘. This may cause an update error. found in
  14. sql思维导图---sql函数
  15. Ignite 安装启动(本地单机)
  16. 文献分享:定义的肿瘤抗原特异性T细胞增强了个性化的TCR-T细胞治疗和免疫治疗反应的预测
  17. php dtu,什么是DTU DTU知识普及基础篇
  18. 一个人知道自己为什么而活,他就可以忍受生活加诸他的一切苦难
  19. 10.26 要尝试让自己安静下来,去做该做的事 而不是让内心烦躁,焦虑,毁掉你本就不多的热情和定力
  20. 个性化设置背景单机版五子棋(含可运行JS代码)

热门文章

  1. Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
  2. Feign数据压缩传输
  3. java 路径 20,java中得到classpath和当前类的绝对路径的一些方法(路径中的%20进行替换空格)...
  4. Meaven的pom文件配置
  5. 全局配置_配置全局异常处理,结果没有想到,spring boot实践(3)
  6. python实现倒n字形排列_Leetcode问题库——Z形变换(Python),补充X形变换,字形
  7. echarts line 去掉最外围方框_干货 | 关于射频芯片最详细解读
  8. python大神交流网站_学习Python必去的8个网站
  9. centos8启动docker-mysql8容器
  10. apache.camel_Apache Camel K 1.0在这里–您为什么要关心