【问题标题】:When is stateless bean instantiated?什么时候实例化无状态bean?
【发布时间】:2018-01-11 12:16:22
【问题描述】:

我正在编写基于 JavaEE 的应用程序,但我不完全确定依赖注入何时发生。假设我有两个课程:

@Stateless
class RepoBean {
@Resource
private SomeResource someResource;

public List<SomeObject> search(String someQuery) {// implementation}
}

@Stateless 
class ServiceBean {
@EJB
private RepoBean repoBean;

public void search(List<String> someQueries {
    for (String someQuery : someQueries) {
        List<SomeObject> someObjects = this.repoBean.search(someQuery)
        for (SomeObject someObject : someObjects) {
            // handle someObject)
        }
    }
}

我的问题是:

  1. repo bean 何时实例化?在服务实例化或使用中?
  2. 如果此循环是 N 个“长”对象,迭代中是否只会使用一个 repoBean 实例,或者每次池都会被要求提供 RepoBean 实例,我无法保证 repo 会相同?
  3. 除了将 repo 的搜索方法修改为 Map&lt;String, List&lt;SomeObject&gt;&gt; search(List&lt;String&gt; searchQueries) 之外,有什么方法可以确保所有查询都在同一个 RepoBean 实例上运行

【问题讨论】:

    标签: java javabeans java-ee-7


    【解决方案1】:

    无状态 bean 实例化是惰性的。如果应用程序启动一个空的无状态 EJB 池,也称为 free pool,将被创建。在第一个客户端请求时,将创建、使用一个具体的 RepoBean 实例,然后将其放入空闲池中。池的大小是可配置的。在一段时间不活动后,实例将被销毁并从池中删除。

    this.repoBeanServiceBean#search 方法内部总是相同的,只要父 ServiceBean 实例还活着。

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      相关资源
      最近更新 更多