假设我有几个春豆:
<beans>
<bean name="A" ... />
<bean name="B" ... />
</beans>
“B”公开不需要“A”的远程服务。假设“A”需要一个不可忽略的时间来加载。这意味着在重新启动循环期间,应用程序挂起远程客户端,该客户端实际上可以连接到服务器,但在弹簧容器完全初始化之前等待响应。
我希望能够做的是让“B”远程服务立即响应,即使(基于应用程序状态)它只能返回NOT_READY或其他类似的东西。但是,容器会强制等待,直到所有bean都被初始化,即使您将bean指定为lazy-init而不管加载顺序如何。
我怀疑立即使用“B”意味着弹簧必须提供部分初始化的容器,这听起来很糟糕。但是,我很欣赏任何人在初始化顺序上获得的任何信息以及您是否找到了任何合理的解决方法。
答案 0 :(得分:3)
不要直接引用bean“A”。相反,请引用bean作为bean“A”的FACTORY;通过这种方式,可以创建Factory bean而无需初始化命中来实例化“A”。当然,您需要重构引用“A”的类来首先检索“A”。
或者,您可以创建一个bean“AA”,它是bean“A”的容器,它具有初始化状态,并公开bean“A”的接口;在调用时,它将其初始化状态设置为未初始化,并在某个线程中开始初始化bean“A”;在“AA”上调用“A”的任何接口方法然后可以阻止或返回未就绪的响应,直到“AA”中的“A”的初始化完成为止。
这一切都取决于你的定义“需要一个不可忽视的加载时间”。为什么需要花费不可忽略的时间来加载?在A中是否有一些特别棘手的初始化?或者A是如此巨大,以至于它扼杀了JVM?
答案 1 :(得分:0)
我不明白,为什么“A需要一个不可忽略的时间加载”,但也许你可以通过重构A来自己初始化。不要使用InitializingBean或处理ApplicationEvent。只需初始化第一个要处理的请求。这会减慢第一个请求!
另一种可能性是将初始化移动到由处理ApplicationEvent的bean创建的分离线程。线程以异步方式调用bean的初始化方法。小心处理对未初始化的bean的请求!