java - Spring初始化顺序

标签 java spring

假设我有一些 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/

相关文章:

java - 如何在运行时为嵌套属性创建 CriteriaBuilder 表达式?

spring - int-ftp :inbound-channel-adapter fetch in sequential order?

java - hibernate + Mysql : Data truncation: Incorrect datetime value

spring - Vaadin 7.4、Spring、Tomcat 7、使用@WebServlet 更改上下文根

java - 如何使用 iText 获取使用多种字体渲染的 pdf

java - 为什么我的 if 语句在这个 for 循环中不起作用?

java - 尝试使用 eclipse 运行 xslt for xml 但它不起作用

java - 从数据库中检索数据时 (PreparedStatement prest) 的问题

java - Spring : previous Line in jdbc template

java - 如何处理 Spring 包裹的 hibernate 异常?