JavaEE中的依赖性——声明依赖性

已下小结描述了一些JavaEE和EJB规范定义的资源注解。每条注解有一个可选的name特性以指定依赖性的引用名称。注解的其他特性特定于所需获取的资源类型。

引用持久化上下文

前面的章节演示了如何通过从Persistence类返回一个EntityManagerFactory,为持久化上下文创建一个实体管理器。在JavaEE环境中,@PersistenceContext注解可以用来声明一个持久化上下文上的依赖性,并且可以自动获取那个持久化上下文所需的实体管理器。

下面代码演示了如何使用@PersistenceContext注解,以通过依赖性注入获得一个实体管理器。unitName元素指定了持久化上下文所基于的持久性单元的名称。

提示:如果忽略unitName元素,那么如何确定用于持久化上下文的单元名称是特定于供应商的。如果应用程序只有一个持久性单元,那么有些供应商可以提供默认值,而其他供应商可能要求在一个特定于供应商的配置文件中指定单元名称。

(代码)

当接受了在一个无状态会话bean中使用状态字段的警告之后,您可能想知道如何保证此代码合法。毕竟,实体管理器必须维护自己的状态,以便能够管理特定的持久化上下文。好消息是JPA规范旨在以JavaEE集成为目的,所以与前面的章节不同,代码中世纪注入的不是一个实体管理器实例。注入bean的值是一个容器托管的代理,它将代表应用程序代码来获取和释放持久化上下文。这是在JavaEE中Java持久化API的一个强大功能,将在后面对其进行深入学习。现在,假设注入值将“做正确的事情”是安全的,不必释放它,并且它能够自动的与应用服务器的事务管理一起工作。

引入持久性单元

可以使用@PersistenceUnit注解引入持久性单元你的EntityManagerFactory。正如@persistenceContext注解一样,unitName元素确定想要访问的EntityManagerFactory实例的持久性单元。如果没有在注解中指定持久性单元名称,那么如何确定该名称将特定于供应商。

下面代码中演示了如何把一个EntityManagerFactory实例注入有状态会话bean中。然后,该bean将在PostConstruct生命周期回调期间从工厂创建一个EntityManager实例。注入的EntityManagerFactory实例可以安全的存储在任何组件实例上。它是线程安全的,当删除bean实例时无需对它进行释放。

(代码)

在JavaEE环境中,不是经常使用持久性单元的EntityManagerFactory,因为注入实体管理器很容易获取和使用。您将在后面看到,从工厂返回的实体管理器和服务器作为相应的@PersistenceContext注解而是提供的实体管理器之间有重要的区别。

引用企业JavaBean

当一个组件需要访问EJB时,它利用@EJB注解声明对该bean的引用。引用类型的目标通常是一个会话bean。消息驱动bean没有客户端接口,因此它们不能直接访问,而且不能注入。我们已经演示了beanInterface元素,用于指定客户端感兴趣的会话bean的业务接口。服务器将搜索所有部署的会话bean以找到一个请求的业务接口的实现。

在罕见的情况下,两个会话bean实现相同的业务接口,或者如果客户端需要访问位于不同EJB jar中的会话bean,那么还可以指定beanName元素,用于通过其名称来标识会话bean。一个会话bean的名称默认为bean类的非限定类名,或者可以设置为显示地使用@Stateless和Stateful注解的name元素。

下面代码重新审视了在上面代码中显示的示例,这次在注入的值上指定beanName元素。不推荐跨多个bean实现共享相同的业务接口。beanName元素应该几乎从未被要求过。

(代码)

引用服务器资源

@Resource注解是指向所有I帧元类型的杂项(catchall)引用,它不对应起劲位置所描述的任何一种类型。它用来定义资源工厂、消息目的地、数据源和其他服务器资源的引用。@Resource注解也是最容易定义的,因为唯一附加的元素是resourceType,如果服务器不能自动指定的话,那么它将允许您指定资源的类型。例如,如果您正在注入的字段是Object(对象)类型,那么服务器没有办法知道您想要的是数据源。resourceType元素可以设置为javax.sql.DataSource,以使得该需要显示化。

@Resource注解的功能之一是可以用来获取特定于组件类型的逻辑资源。这将包括EJBContext实现以及诸如EJB计时器服务之类的服务。如果没有同样地对它进行定义,那么将使用setter注入来获取在上面代码中的EBContext实例。为了完成该示例,将在setSessionContext方法上放置@Resource注解。下面代码重新审视了上面代码中的示例,这次演示了使用字段注入获取一个SessionContext实例。

(代码)

时间: 2024-08-03 19:59:28

JavaEE中的依赖性——声明依赖性的相关文章

JavaEE中的依赖性——依赖查找

关于依赖性管理我们要介绍的第一个策略就是依赖查找(dependency lookup).这种策略是JavaEE中传统形式的依赖性管理,这里可以看到JavaEE规范中的JNDI(Java Naming andDirectoryInterface)的身影.从名字就可以看出来这里解决依赖性是通过查找的方式. 就像上篇文章提到的,所要引用的资源是通过一对name与target对应的注解标识的.name用来表明此资源被依赖时候的名字,所以当资源注解放在类定义之上的时候需要为其起个名字.但是如果资源注解放在

JavaEE中的依赖性——依赖性注入

当一个资源注解防止在一个字段或setter方法之上时,将会发生两件事.首先,就像放置在bean类之上一样声明资源引用(类似于上文中的代码示例),而且当创建组件时将把资源名称绑定到环境命名上下文.第二,该服务器将为您自动进行依赖性查找,并把结果设置到实例化的类中. 自动超找一个资源并将它设置到类中的过程称之为依赖性注入(dependency injection)因为据说服务器将把解析的依赖性注入类中.这种技术,其中一项通常称作控制反转(inversion of control),消除了手动从JND

C++中的inline声明

C++中的inline声明 1. inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把函数指定为内联函数. inline int min(int first, int secend) { /****/ };   inline 函数对编译器而言必须是可见的,以便它能够在调用点(调用这个内联函数的位置)内展开该函数. 与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定 义.当然,对于同一程序的不同文件,如果in

PHP中的函数声明与使用

函数 1.  函数名是标识符之一,只能有字母数字下划线,开头不能是数字: 函数名的命名,必须符合"小驼峰法则"FUNC(),func(),Func(); 函数名不区分大小写; 函数名不能与已有函数同名,不能与内置函数名同名: 2.   function_exists("func");用于检测函数是否已经声明: 注意传入的函数名,必须是字符串格式,返回结果为true/false: echo打印时,true为1,false不显示: [php中变量的作用域] 1.局部变量

C#中方法的声明

C#中方法的声明(四要素) 访问修饰符 :public,private(方法的默认访问修饰符) 返回值类型:void 和 非void 方法名称    : 规范是方法名称取动词,每个单词的首字母大写. 方法体       :编写逻辑语句 1.说起访问修饰符,就都说一遍吧. Public:公共的,在同一个命名空间下,任何类都可以访问,在不同的命名空间下,要访问的话,添加对应的命名空间,并添加引用即可. Internal:在当前程序集中可以访问. protected:受保护的,在父类和父类的子类中可以

C++中全局变量的声明和定义

原文链接:http://blog.csdn.net/candyliuxj/article/details/7853938 (1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步:将每个.cpp和相应的.h文件编译成obj文件: 第二步:将工程所有的obj文件进行Link,生成最终的.exe文件. 这样,错误可能在两个地方产生: 一个是在编译的时候发生的错误,主要是语法错误: 一个是在链接的时候的错误,主要是重复定义变量等. 编译单元指在编

【Javaweb】修改Eclipse for JavaEE中新建Jsp的默认编码,避免每次新建都要改编码的问题

Eclipse for JavaEE中新建Jsp的默认编码是ISO-8859-1, 这让人非常苦恼,每次新建一个Jsp都要按Ctrl+F,把所有ISO-8859-1替换成utf-8,才可以. 具体如下图: 这都什么年代呢?连2010出版的Dreamweaver CS4的默认编码都是utf-8,已经不是Dreamweaver 8的gbk了.这都什么年代了,Eclipse for Javaee不国际化起来? 幸好这东西可以如下图修改,选择Windows->Perference,在弹出的窗口的输入框中

js中变量的声明

大家都知道js中变量的声明是要提前的,以下有4个例子: 1.if(!"t" in window){ var t = 1; } alert(t);答案是undefined,为什么呢,就是因为变量声明提前了,所以t是在window对象里面的,但是没有走下面的判断,所以并没有赋值,答案就是undefine 2.var num = 100; function fn(){ var num = num + 1; return num; } falert(n());答案依然是NaN,因为在函数体内部

关于C++中的前置声明

链接:http://patmusing.blog.163.com/blog/static/135834960201038113714199/ 关于C++中的前置声明,码迷,mamicode.com