6

我有一个带模块的 EAR:

  • foo-api.jar
  • foo-impl.jar
  • 拦截器.jar

在 foo-api 中有:

@Local
FooService // (interface of a local stateless session bean)

在 foo-impl 中有:

@Stateless
FooServiceImpl implements FooService //(implementation of the foo service)

在interceptor.jar 我想要

public class BazInterceptor {

  @EJB
  private FooService foo;

  @AroundInvoke
  public Object intercept( final InvocationContext i) throws Exception {
    // do someting with foo service
    return i.proceed();
  }

问题是:

兼容 Java EE 5 的应用服务器(例如 JBoss 5)会注入拦截器吗?如果不是,那么访问会话 bean 的好策略是什么?

考虑:

  • 部署顺序/竞争条件
4

2 回答 2

7

是的,注入应该发生在拦截器中,例如在Java EE 5 平台简介文章中提到的(粗体是我的):

通过依赖注入更轻松地访问资源

依赖注入是一种模式,其中对象的依赖由该对象外部的实体自动提供。对象不需要明确地请求这些资源,例如,通过在命名服务中查找它们。在 Java EE 5 平台中,依赖注入可以应用于组件所需的所有资源,从而有效地将资源的创建和查找隐藏在应用程序代码中。依赖注入可以应用于整个 Java EE 5 技术——在 EJB 软件容器、Web 容器和客户端中。

为了请求注入资源,组件使用@Resource 注解,或者在某些专用资源的情况下,使用@EJB@WebServiceRef注解。以下是可以注入的许多资源中的一些:

  • SessionContext目的
  • DataSources目的
  • UserTransaction
  • EntityManager界面
  • TimerService界面
  • 其他企业 bean
  • 网页服务
  • 消息队列和主题
  • 资源适配器的连接工厂
  • 环境条目(例如,字符串、整数等)

任何组件类都可以请求资源注入,即生命周期由容器管理的任何类。在 EJB 软件容器中,支持注入的组件包括:

  • EJB 技术组件
  • 拦截器
  • Java API for XML Web Services (JAX-WS) 和 Java API for XML-based RPC (JAX-RPC) 的消息处理程序

在 web 容器中,支持注入的组件如下:

  • Servlet、Servlet 过滤器、事件监听器
  • 标签处理程序、标签库事件监听器
  • 托管豆

在客户端容器中, 类和login回调处理程序组件支持注入。

另请参阅JBoss EJB 3.0 教程的EJB 拦截器部分:

就像 bean 类一样,拦截器可以成为依赖注入的目标。其工作方式的格式是相同的,并且注入在与拦截器绑定到的 bean 相同的 ENC 上工作。

...

请记住,拦截器遵循与它们绑定的 bean 相同的生命周期。拦截器在创建 bean 实例的同时创建,依赖注入发生在第一个业务方法被调用之前。

资源

于 2010-11-20T15:07:35.340 回答
-1

我的经验表明注入只能发生在托管类中:EJB(实体、会话或消息)和 Servlet。

于 2009-09-11T15:08:00.663 回答