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

来源:互联网 发布:钢结构工程量计算软件 编辑:程序博客网 时间:2024/05/01 13:47

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

引用持久化上下文

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

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

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

(代码)

当接受了在一个无状态会话bean中使用状态字段的警告之后,您可能想知道如何保证此代码合法。毕竟,实体管理器必须维护自己的状态,以便能够管理特定的持久化上下文。好消息是JPA规范旨在以JavaEE集成为目的,所以与前面的章节不同,代码中世纪注入的不是一个实体管理器实例。注入bean的值是一个容器托管的代理,它将代表应用程序代码来获取和释放持久化上下文。这是在JavaEEJava持久化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类的非限定类名,或者可以设置为显示地使用@StatelessStateful注解的name元素。

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

(代码)

引用服务器资源

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

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

(代码)

1 0
原创粉丝点击