我正在编写基于 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)
}
}
}
我的问题是:
- repo bean 何时实例化?在服务实例化时还是在使用时?
- 如果这个循环是 N 个“长”对象,迭代中是否只会使用一个 repoBean 实例,或者每次都会向池请求 RepoBean 实例,但我不能保证 repo 是相同的?
- 除了将 repo 的搜索方法修改为
Map<String, List<SomeObject>> search(List<String> searchQueries)
之外,还有什么方法可以确保所有查询都在同一个 RepoBean 实例上运行吗?
最佳答案
无状态 bean 实例化是惰性的。如果应用程序启动,将创建一个空的无状态 EJB 池,也称为空闲池。在第一个客户端请求时,将创建、使用一个具体的 RepoBean 实例,然后将其放入空闲池中。池的大小是可配置的。经过一段不活动时间后,实例将被销毁并从池中删除。
this.repoBean
在 ServiceBean#search
方法内部将始终相同,并且只要父 ServiceBean
实例处于 Activity 状态。
关于java - 无状态bean什么时候实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48206873/