我可以将SessionBean注入Java EE AroundInvoke-Interceptor吗?

Mic*_*her 6 java jboss dependency-injection java-ee interceptor

我有一个带模块的EAR:

  • FOO-api.jar文件
  • FOO-impl.jar中
  • interceptor.jar

在foo-api中有:

@Local
FooService // (interface of a local stateless session bean)
Run Code Online (Sandbox Code Playgroud)

在foo-impl中有:

@Stateless
FooServiceImpl implements FooService //(implementation of the foo service)
Run Code Online (Sandbox Code Playgroud)

在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();
  }
Run Code Online (Sandbox Code Playgroud)

问题是:

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

考虑:

  • 部署订购/竞争条件

Pas*_*ent 7

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

通过依赖注入更容易访问资源

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

要请求注入资源,组件使用@Resource 注释,或者在某些专用资源的情况下,使用注释@EJB@WebServiceRef注释.以下是可以注入的一些资源:

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

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

  • EJB技术组件
  • 拦截器
  • 用于XML Web服务的Java API(JAX-WS)和用于基于XML的RPC的Java API(JAX-RPC)的消息处理程序

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

  • Servlet,servlet过滤器,事件监听器
  • 标记处理程序,标记库事件侦听器
  • 管理豆类

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

另请参阅JBoss EJB 3.0教程EJB Interceptors部分:

就像bean类一样,拦截器可以成为依赖注入的目标.它的工作原理的格式是相同的,注入与拦截器绑定的bean在同一个ENC上工作.

...

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

资源


小智 -1

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