假设我有几个春豆:

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

&QUOT; B&QUOT;公开不需要“A”的远程服务。假设“A”为“A”。需要一个不可忽略的时间来加载。这意味着在重新启动循环期间,应用程序挂起远程客户端,该客户端实际上可以连接到服务器,但在弹簧容器完全初始化之前等待响应。

我希望能够做到的是“B”。远程服务立即响应,即使(基于应用程序状态)它只能返回NOT_READY或其他类似的东西。但是,容器会强制等待,直到所有bean都被初始化,即使您将bean指定为lazy-init而不管加载顺序如何。

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

有帮助吗?

解决方案

不要引用bean“A”;直。相反,请引用bean作为bean的“A”的FACTORY;以这种方式,可以创建Factory bean而不需要初始化命中来实例化“A”。你需要重构你的类,这些类引用了“A”。检索“A”首先,当然。

或者,您可以创建一个bean“AA”,它是bean“A”的容器,它具有初始化状态,并暴露bean“A”的接口;在调用时,它将其初始化状态设置为未初始化,并开始初始化bean“A”。在一些线程;调用“A”的任何接口方法。在“AA”上然后可以阻止或返回未准备好的响应,直到“A”的初始化为止。在“AA”范围内已经完成了。

这种情况取决于您对“加载时间不可忽略”的定义。是。为什么需要花费不可忽略的时间来加载?在A中是否有一些特别棘手的初始化?或者A是如此巨大,以至于它扼杀了JVM?

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top