如何在Spring中实现弹性bean?

我有一个Spring bean,它在构造函数中通过http访问外部系统。 如果外部系统在启动时不可用,则无法创建bean并且应用程序无法正常启动。

我希望我的应用程序能够启动,无论外部系统如何。 我宁愿缺少function一段时间而不是重启应用程序。

我知道在Spring中可以通过正确选择范围和代理bean工厂来实现这一点,但我不确定它是如何实现的。 在我看来,Spring AOP的大多数部分旨在修改成功创建的目标,并且无法在创建期间处理激活或我错了吗?

简而言之:我想要一个在第一次访问时创建目标bean的代理,然后只要它工作就保留该实例。 如果它无法创建它,它应抛出exception并在下次调用代理时重试。

那么,您将如何实现此function?

你尝试过懒豆启动吗?

 

你不应该把这个bean设置为Singleton bean的属性,因为它会在启动时启动它。

我最终创建了一个ResilientBeanProxy,它将实际的创建推迟到以后,所以是的,它几乎就像Spring的惰性初始化,但增加了它在init期间处理exception的function。 例如,它不会停止创建应用程序上下文,在启动过程中会发生错误。

如果创建失败,将在下次调用时重试。

考虑你的bean在施工时间是否真的依赖于远程资源? 也许你可以在这里简单地使用lazy init ? 您不会在构造函数中调用此外部系统,而是在需要远程资源时首先调用它的方法。 如果资源不存在,则会发生一种ResourceUnavailableException ,并显示消息'Try again later'