java - 无状态bean什么时候实例化?

标签 java javabeans java-ee-7

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

@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<String, List<SomeObject>> search(List<String> searchQueries) 之外,还有什么方法可以确保所有查询都在同一个 RepoBean 实例上运行吗?

最佳答案

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

this.repoBeanServiceBean#search 方法内部将始终相同,并且只要父 ServiceBean 实例处于 Activity 状态。

关于java - 无状态bean什么时候实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48206873/

相关文章:

java - 获取未知类的 java bean 的属性

java - 无法获取可用的提供程序解析器

java - 无法通过持久性删除来删除 jpa 子实体

jsf - JSF 中的 class 和 styleClass 属性有什么区别?

java - 当按位操作字节时会发生什么?

java - Fluent Iterable 从包含泛型类的列表中进行数组

mysql - 无法在 jdbc 准备好的语句中的外键表中插入数据

java - 在容器管理的实体管理器中获取 javax.persistence.TransactionRequiredException

java - JDom 是否有任何 org.w3c.dom 包装器?

java - 我的项目需要哪些 Java Mail JAR?