Java 需要从另一个EJB进行预配置的无状态EJB

Java 需要从另一个EJB进行预配置的无状态EJB,java,jakarta-ee,ejb,ejb-3.0,Java,Jakarta Ee,Ejb,Ejb 3.0,我有两个无状态EJB,如下所示 @Stateless public class BeanA { @EJB private BeanB beanB; @PostConstruct public void init(){ // trying to do some pre-configuration beanB.configure(Map params); } public void doSomething(){

我有两个无状态EJB,如下所示

@Stateless
public class BeanA {
    @EJB
    private BeanB beanB;
    @PostConstruct
    public void init(){
       // trying to do some pre-configuration
       beanB.configure(Map params);
    }
    public void doSomething(){
       beanB.doSomething();
    }         

} 

@Stateless
public class BeanB {

}
在使用BeanB之前,我需要为每个BeanB实例运行一些预配置。在大多数情况下,上面的代码完成了这项工作,我想这是因为BeanB的实例仅由来自BeanA实例的请求创建

但最后我看到,有时“BeanB”bean池可以包含未预先配置的实例。按照规范,这种行为是正常的,所以我意识到这种方法是一种误用

所以我的问题是,有没有一种合法的方法来进行这种预配置?
我应该改为创建BeanB有状态吗?

您永远不知道将调用哪个无状态bean实例。因此,您可能会配置BeanB的一个实例,下次使用它时,您将获得另一个未配置的实例。 因此,在本例中,我建议使用一些sessionScopedBean,在这个sessionScopedBean中,您从BeanA保存参数,每次使用BeanB时,您都将从sessionScopedBean加载这些参数

在BeanB(无状态bean)中不应该有全局参数

什么是示波器?

您在BeanB的预配置中具体做了什么?这些情人来自哪里?似乎BeanA和BeanB是紧密耦合的,例如,共享一些生命周期。它们是否单独使用过?参数主要作为env注入BeanA。条目,但这些条目不能直接注入BeanB。参数用于确定必须在BeanB中实例化组件的哪个特定实现。对每个请求进行实例化不是很昂贵,但我还是更愿意尝试一次。你是对的,BeanA和BeanB从来都不是独立使用的。BeanB是否可以作为POJO而不是EJB进行管理?这样,您就可以在init()方法中实例化BeanB。你甚至可以考虑将BeANB重新设计为BeANA的内部类,以便在必要时调用BeANA上的代理方法。不幸的是,如果没有特定的上下文,很难真正理解您在做什么。
@PostConstruct
方法将只被调用一次:因为无状态会话bean从未被钝化,所以它的生命周期只有两种状态,“不存在”和“就绪”。EJB容器创建(并维护)无状态会话bean的实例池。执行依赖注入(如果有的话),然后调用一个用
@PostConstruct
注释的方法(如果存在)。此后将永远不会调用该方法(同样取决于容器,
@PostConstruct
方法可能是不必要的事务性方法。在EJB3.2中,对于无状态会话bean未指定该方法)。