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

时间:2009-05-25 13:40:39

标签: 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)

在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的好策略是什么?

考虑:

  • 部署订购/竞争条件

2 个答案:

答案 0 :(得分:6)

是的,注射应该在拦截器中进行,例如An Introduction to the Java EE 5 Platform文章中提到的(粗体是我的):

  

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

     

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

     

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

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

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

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

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

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

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

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

  

就像一个bean类,一个拦截器   可以成为依赖的目标   注射。这个格式如何   工作是一样的,注入   与bean相同的ENC工作   拦截器绑定的。

     

...

     

请记住,拦截器遵循   与它们相同的生命周期   势必。拦截器已创建   与bean实例同时出现   创建,依赖注入   发生在第一个业务之前   方法被称为。

资源

答案 1 :(得分:-1)

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