EJB 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“ 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SignalR + MVC5 简单示例

SignalR MVC5 简单示例 原文:SignalR MVC5 简单示例本文和前一篇文章很类似&#xff0c;只不过是把 SignalR 应用在了 MVC 中 新建项目&#xff0c;选择 MVC 模板 安装 SignalR Install-Package Microsoft.AspNet.SignalR 在项目中添加文件夹 Hubs 在 Hubs 文件夹中添加 Sign…

Java内存模型–快速概述和注意事项

在计算中&#xff0c; 内存模型描述了线程如何通过内存进行交互&#xff0c;或更一般地&#xff0c;它指定了为分段内存或分页内存平台生成代码时允许编译器进行的假设。 在给定程序和该程序的执行跟踪的情况下&#xff0c;它实质上描述了执行跟踪是否是该程序的合法执行。 Jav…

6-7 统计某类完全平方数 (20 分)

本题要求实现一个函数&#xff0c;判断任一给定整数N是否满足条件&#xff1a;它是完全平方数&#xff0c;又至少有两位数字相同&#xff0c;如144、676等。 函数接口定义&#xff1a; int IsTheNumber ( const int N );其中N是用户传入的参数。如果N满足条件&#xff0c;则该…

C#中数组、ArrayList和List三者的区别(转) ,加修改

在C#中数组&#xff0c;ArrayList&#xff0c;List都能够存储一组对象&#xff0c;那么这三者到底有什么样的区别呢。 数组 数组在C#中最早出现的。在内存中是连续存储的&#xff0c;所以它的索引速度非常快&#xff0c;而且赋值与修改元素也很简单。 <span style"font…

phpmyadmin mysql Access denied for user 'root'@'localhost'问题解决

centos6.4 32位的vps上装了lnmp以后&#xff0c;phpmyadmin无法连接mysql服务器&#xff0c;ssh命令行里mysql -uroot -p 命令后老是出现拒绝连接的情况。php程序里也是拒绝连接。尝试过修改phpmyadmin的config.inc.php文件&#xff0c;尝试过修改my.cnf文件&#xff0c;尝试过…

带有Spring和Maven教程的JAX–WS

Spring框架通过JAX-WS提供对Web服务的远程支持&#xff0c;实际上&#xff0c;如Spring 参考文档中所述 &#xff0c;有三种将Spring POJO服务公开为JAX-WS Web服务的方式&#xff1a; 公开基于Servlet的Web服务&#xff08;适用于Java EE 5环境&#xff09; 导出独立的Web服…

7-2 然后是几点 (15 分)

7-2 然后是几点 (15 分) 有时候人们用四位数字表示一个时间&#xff0c;比如 1106 表示 11 点零 6 分。现在&#xff0c;你的程序要根据起始时间和流逝的时间计算出终止时间。 读入两个数字&#xff0c;第一个数字以这样的四位数字表示当前时间&#xff0c;第二个数字表示分钟…

CXF学习(2) helloworld

0.新建一个项目取名wsserver. pom.xml 文件如下 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd…

Hive 接口介绍(Web UI/JDBC)

Hive 接口介绍&#xff08;Web UI/JDBC&#xff09; 实验简介 本次实验学习 Hive 的两种接口&#xff1a;Web UI 以及 JDBC。 一、实验环境说明 1. 环境登录 无需密码自动登录&#xff0c;系统用户名shiyanlou&#xff0c;密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubu…

Java最佳实践– Char到Byte和Byte到Char的转换

在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论String性能调优。 特别是&#xff0c;我们将重点介绍使用默认编码时如何有效地处理字符到字节和字节到字符的转换。 本文总结了两种提议的自定义方法与两种经典方法&#xff0…

IOS-C文件的创建于初始化函数.void init() write_file()

//文件初始化 void init(){ FILE * fpNULL; fpfopen("telbook.data", "rb"); int count0; if (fpNULL) //没有这个文件就把这个文件创建出来 { fpfopen("tellbook.data", "wb"); fwrite(&count, sizeof(count), 1, fp); fclose(…

7-3 逆序的三位数 (10 分)

7-3 逆序的三位数 (10 分) 程序每次读入一个正3位数&#xff0c;然后输出按位逆序的数字。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如输入700&#xff0c;输出应该是7。 输入格式&#xff1a; 每个测试是一个3位的正整数。 输出格式&a…

抛弃优启Grub4dos和PE大多数时间可以这样用

抛弃优启Grub4dos和PE大多数时间可以这样用 在能够进入Windows的情况下&#xff0c;Grub4dos和PE大多数时间可以这样用 http://yunpan.cn/cyuuUtUQMfmGN 提取码 c2acGrub4dos的出现颠覆了传统的EZBOOT光盘启动模式&#xff0c;很多人用grub4dos来实现优盘启动&#xff0c;同时g…

Java最佳实践–队列之战和链接的ConcurrentHashMap

在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将在四个具有相关语义的流行Queue实现类之间进行性能比较。 为了使事情变得更现实&#xff0c;我们将在多线程环境下进行测试&#xff0c;以讨论和演示如何将ArrayBlockingQueue &am…

HDU 5652 India and China Origins(二分 + BFS)

本文链接:http://www.cnblogs.com/Ash-ly/p/5398867.html 题意&#xff1a; 中国和印度之间有一片地方&#xff0c;把这片地方抽象化&#xff0c;于是就可以看成一个N * M矩阵&#xff0c;其中黑色的代表高山不能走过去&#xff0c;白色的代表平原&#xff0c;可以通行,人每次可…

C语言%.2f四舍五入

#include <stdio.h> int main() {double d 1.199;printf("%.2f", d);return 0; }输出1.20 如果不想让其四舍五入可以这样&#xff1a; #include <stdio.h> #include <math.h> int main() {double d 1.199;printf("%.2f", floor(d * 1…

关于使用racthet的push.js

racthet的push是用来跳转另外一个页面的效果的。但是必须在服务器的环境下支持。如果想要让本地html访问支持的话需要添加 转载于:https://www.cnblogs.com/djawh/p/4623925.html

休眠自动提交命令强制MySQL在过多的磁盘I / O中运行

亲爱的大家&#xff0c; 我敢肯定&#xff0c;你们中的许多人都在使用Hibernate和MySQL&#xff0c;我自己在这里和那里都使用它。 通常&#xff0c;编程模型是不错的&#xff0c;但是普通的JDBC可以快很多已经不是什么秘密了。 在这篇文章中&#xff0c;我想引起您的注意Hibe…

“应用程序无法正常启动(oxc000007b)”解决方案

解决方案1 通过“DirectX修复工具 V3.3 标准版”软件修复。 备注&#xff1a;经过测试&#xff0c;并未解决本人的问题&#xff0c;但是这个方法可能对游戏中缺失相关.dll&#xff08;动态链接库&#xff09;有帮助。 解决方案2&#xff1a; 该问题的出现不适偶然&#xff0c;主…

Linux: dev: cmake: CHECK_LIBRARY_EXISTS

文章目录 简介例子源代码最终调用到的两个命令如果结果是这里为什么不直接使用rpm查看包呢&#xff1f;需要注意的问题 简介 https://cmake.org/cmake/help/latest/module/CheckLibraryExists.html 这个方法是在Modules/CheckLibraryExists.cmake文件里定义的一个宏。 最终使用…