假设我有几个spring bean:
<beans>
<bean name="A" ... />
<bean name="B" ... />
</beans>"B“公开了一个不需要"A”的远程服务。假设"A“花了不可忽略的时间来加载。这意味着在重新启动周期中,应用程序挂起远程客户端,该客户端实际上可以连接到服务器,但会等待响应,直到spring容器完全初始化。
我希望能够做的是让"B“远程服务立即响应,即使(基于应用程序状态)它只能返回NOT_READY或类似的内容。然而,即使您将bean指定为lazy-init并且与加载顺序无关,容器也会强制等待,直到它的所有bean都被初始化。
我怀疑让"B“立即可用意味着spring必须提供一个部分初始化的容器,这听起来很糟糕。但是,我非常感谢任何人得到的关于初始化顺序的任何信息,以及您是否找到了任何合理的解决方法。
发布于 2008-10-16 20:24:23
不要直接引用bean "A“。相反,引用一个bean,它是bean "A“的工厂;通过这种方式,可以创建工厂bean,而不需要为实例化”A“而进行初始化。当然,您需要重构引用"A“的类,以便首先检索"A”。
或者,您可以创建一个bean "AA",它是bean "A“的容器,它具有初始化状态,并公开bean "A”的接口;在调用时,它将其初始化状态设置为not initialized,并开始在某个线程中初始化bean "A";然后,对"AA“上的"A”的任何接口方法的调用都可以阻塞或返回not ready响应,直到"AA“中的"A”的初始化完成。
这在某种程度上取决于你对“花费不可忽略的时间来加载”的定义。为什么要花费不可忽略的时间来加载?在A中有没有一些特别棘手的初始化?或者,A是如此巨大,以至于会扼杀JVM吗?
发布于 2008-10-14 19:56:41
我不明白,为什么"A花了不可忽略的时间来加载“,但也许你可以通过重构A来懒惰地初始化自己。不要使用InitializingBean或处理ApplicationEvent。只需在要处理的第一个请求上进行初始化。这会减慢第一个请求的速度!
另一种可能是将初始化移动到由处理ApplicationEvent的bean创建的单独线程。线程以异步方式调用bean的初始化方法。小心处理对未初始化bean的请求!
https://stackoverflow.com/questions/201888
复制相似问题