我有一个带模块的EAR:
在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的好策略是什么?
考虑:
答案 0 :(得分:6)
是的,注射应该在拦截器中进行,例如An Introduction to the Java EE 5 Platform文章中提到的(粗体是我的):
通过依赖注入更轻松地访问资源
依赖注入是一种模式 对象的依赖关系 由实体自动提供 在该对象外部。对象是 不要求这些 资源明确地,例如,通过 在命名服务中查找它们。 在Java EE 5平台中,依赖 注射可以适用于所有人 组件需要的资源, 有效隐藏创作和 从应用程序中查找资源 码。依赖注入可以 适用于整个Java EE 5 技术 - 在EJB软件中 容器,网络容器和 客户端。
要请求注入资源,a 组件使用
@Resource
注释,或者在某些情况下 专业资源,@EJB
和@WebServiceRef
注释。 以下是其中一些 可以注入的资源:
SessionContext
objectDataSources
objectUserTransaction
EntityManager
interfaceTimerService
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。