2008-10-14 81 views
2

假设我有一对夫妇春豆:春天初始化顺序

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

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

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

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

+0

你能解释为何bean中采用“不可忽略的时间”来实例化本身?是否可以重新分解Bean A,以便不可忽略的时间成为在实例化过程之外调用的函数? – 2008-10-14 19:36:37

回答

3

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

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

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

0

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

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

+0

当加载时,调用者会挂起直到超时,因为他们可以打开套接字但等待服务器初始化完成。想要手动加载服务以立即响应。我希望避免在手动启动的后台线程中初始化的混乱选择。 – 2008-10-14 20:05:22