假设我有一些 Spring Bean :
<beans>
<bean name="A" ... />
<bean name="B" ... />
</beans>
“B”公开不需要“A”的远程服务。假设“A”的加载时间不可忽略。这意味着在重新启动周期中,应用程序挂起远程客户端,该客户端实际上可以连接到服务器,但会等待响应,直到 spring 容器完全初始化。
我希望能够做的是让“B”远程服务立即响应,即使(基于应用程序状态)它只能返回 NOT_READY 或类似的内容。然而,容器会强制等待,直到所有 Bean 都初始化完毕,即使您将 Bean 指定为惰性初始化并且无论加载顺序如何也是如此。
我怀疑让“B”立即可用意味着 spring 必须提供一个部分初始化的容器,这听起来很糟糕。但是,我希望任何人能够获得有关初始化顺序的任何信息,以及您是否找到了任何合理的解决方法。
最佳答案
不要直接引用 bean“A”。相反,引用作为 bean“A”的 FACTORY 的 bean;通过这种方式,可以创建 Factory bean,而无需执行实例化“A”的初始化操作。当然,您需要重构引用“A”的类以首先检索“A”。
或者,您可以创建一个bean“AA”,它是bean“A”的容器,它具有初始化状态,并且公开bean“A”的接口(interface);调用时,它将其初始化状态设置为未初始化,并开始在某个线程中初始化 bean“A”;然后,对“AA”上“A”的任何接口(interface)方法的调用都可以阻塞或返回未就绪的响应,直到“AA”中“A”的初始化完成。
这一切都取决于您对“加载时间不可忽略”的定义。为什么加载需要花费不可忽略的时间? A 中是否发生了一些特别棘手的初始化?或者 A 实在是太大了以至于让 JVM 窒息了?
关于java - Spring初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/201888/