Spring初始化顺序

假设我有几个春豆:


   
   

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

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

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

2
你能否详细说明为什么Bean A需要一个“不可忽视的时间”来实例化自己?是否可以重新分解Bean A,以便不可忽略的时间成为在实例化过程之外调用的函数?
额外 作者 David Harrison,

2 答案

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

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

这一切都取决于你对“不可忽视的时间加载”的定义是什么。为什么需要花费不可忽视的时间来加载? A中是否有一些特别棘手的初始化?或者是巨大的骇人听闻的JVM?

3
额外

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

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

0
额外
当一个负载,呼叫者挂起,直到超时,因为他们可以打开一个套接字,但等待服务器初始化完成。想手动加载服务立即作出回应。我希望避免在手动启动的后台线程中初始化的混乱选择。
额外 作者 Steve B.,