2

假设我有几个春豆:

<beans>
   <bean name="A" ... />
   <bean name="B" ... />
</beans>

“B”公开了一个不需要“A”的远程服务。假设“A”的加载时间不可忽略。这意味着在重新启动周期期间,应用程序挂起远程客户端,远程客户端实际上可以连接到服务器但等待响应,直到 spring 容器完全初始化。

我想做的是让“B”远程服务立即响应,即使(基于应用程序状态)它只能返回 NOT_READY 或类似的东西。然而,容器会强制等待,直到它的所有 bean 都被初始化,即使您将 bean 指定为惰性初始化并且与加载顺序无关。

我怀疑让“B”立即可用意味着 spring 必须提供一个部分初始化的容器,这听起来很糟糕。但是,我很感激任何人在初始化顺序上获得的任何信息,以及您是否找到了任何合理的解决方法。

4

2 回答 2

4

不要直接引用bean“A”。相反,引用一个 bean,它是 bean "A" 的 FACTORY;通过这种方式,可以创建工厂 bean,而无需为实例化“A”而进行初始化命中。当然,您需要重构引用“A”的类以首先检索“A”。

或者,你可以创建一个bean“AA”,它是bean“A”的容器,它有一个初始化状态,并且暴露了bean“A”的接口;调用时,它将其初始化状态设置为未初始化,并在某个线程中开始初始化 bean“A”;对“AA”上的“A”的任何接口方法的调用可以阻塞或返回未就绪响应,直到“AA”中的“A”初始化完成。

这一切都取决于您对“加载时间不可忽略”的定义是什么。为什么加载需要不可忽略的时间?A 中是否有一些特别棘手的初始化?还是 A 太大了以至于阻塞了 JVM?

于 2008-10-16T20:24:23.110 回答
0

我不明白,为什么“加载 A 需要不可忽略的时间”,但也许你可以通过重构 A 来懒惰地初始化自己。不要使用 InitializingBean 或处理 ApplicationEvent。只需初始化要处理的第一个请求。这将减慢第一个请求!

另一种可能性是将初始化移动到由处理 ApplicationEvent 的 bean 创建的单独线程。线程以异步方式调用 bean 的初始化方法。小心处理对未初始化 bean 的请求!

于 2008-10-14T19:56:40.610 回答