3

是否CDI允许以某种方式进行池化?因为我认为这是EJBbean 的一个特性,但 Adam Bien 在这个截屏视频中说容器选择是通过反射创建新的类实例还是使用现有的。所以如果我有例如这两个豆子

@RequestScoped
public class RequestBean {

    public void doIt() {

    }
}

@SessionScoped
public class SessionBean {

    @Inject
    private RequestBean bean;    

    public void doSomething() {
        bean.doIt();
    }
}

问题是 - 是否总是RequestBean在调用时创建新实例,doSomething或者CDI容器是否以某种方式管理池中的实例?

4

1 回答 1

10

第一个是针对请求的,因此会为每个请求创建一个新实例。第二个的范围是会话,因此为每个会话创建一个新的。

CDI 不会池化和回收对象,因为它不知道对象是否有状态,并且您不希望在请求中取回 bean 在先前请求中的状态。这将破坏请求/会话范围的全部意义。

除非创建 bean 的成本真的很高(因为它们会启动一个新的连接或类似的东西),否则池化它们不会带来任何优势。如今,短期对象的创建和垃圾收集速度非常快。如果创建 bean 真的很昂贵,那么它可能应该是一个单例。

于 2013-05-23T20:56:39.523 回答