目前我们有一个复杂的 POJO 对象结构来处理 Web 服务请求,称为“处理器”。
在处理此请求期间调用的远程和本地 EJB 以及 PersistenceContext 在无状态 bean 中初始化,并交给此“处理器”构造函数,该构造函数在每个 Web 服务请求期间重新创建。
如果我不想在我的“处理器”深处恢复 JNDI 查找,我会继续通过我的代码拖动所有这些 EJB。
输入 CDI。我希望能够在需要时将这些 EJB 注入到这个“处理器”中。
但是,我也注意到这意味着当前的“处理器”本身必须成为 CDI bean:因此,在实现 Web 服务的无状态会话 Bean 中使用 @Inject。
当我这样做时,处理器的整个生命周期将绑定到 bean,而不是绑定到其服务的请求。
突然我必须考虑到我不应该在处理器中保留状态(注入的对象除外),因为此状态将在多个 Web 服务调用之间共享。作为一名程序员,这并没有让我的生活变得更轻松。
那么:我应该如何去做呢?我已经阅读过有关范围界定的内容,但我不确定这是否/如何对我有帮助。
示例,无状态 bean:
@Stateless
@WebService
public class ExampleBean {
@Inject
Processor requestScopedInstance;
int beanDependentScopeCounter;
public String sayHello() {
System.out.println( "bean object id: " + this.toString() );
return requestScopedInstance.sayHello(beanDependentScopeCounter++);
}
}
界面:
public interface Processor {
String sayHello(int beanScopedCounter);
}
实施:
public class ProcessorImpl implements Processor {
private int requestScopedCounter = 0;
@Override
public String sayHello(int beanScopedCounter) {
return "test, requestScoped: " + requestScopedCounter++ + ", beansScoped: " + beanScopedCounter;
}
}
When I do this the entiry lifecycle of the processor becomes bound to the bean and not to the request its serving
这是不正确的。仅当您不使用 @ApplicationScoped、@SessionScoped、@RequestScoped 时才会出现这种情况。
所以:
@PostConstruct
带注释的方法。@ApplicationScoped
,非无状态 POJO 可以保持依赖范围,这是默认的。这是可能的,因为注入的是代理,而不是实际的 bean。使用这些代理 CDI 可确保您的特定调用使用正确的范围。