我们的Java应用程序加载了超过1000个插件,这些插件都是我们使用ApplicationContext#registerBeanDefinition()方法注册为Spring的。这些bean通常还有其他依赖项,我们也使用相同的方法将其注册为spring (包括我们的核心应用程序代码),总共大约有7,000个Spring definitions...not。
问题是启动时间很长(仅加载插件bean定义的时间约为6.5分钟)。当我们的应用程序使用已经注册了bean定义的插件来处理其他请求时,我们更愿意将这个加载时间扩展到更长的时间。大多数插件很少使用。因此,我们确实希望懒洋洋地注册我们的bean定义(-这与我们今天已经在上做的单例bean的懒惰-init不同)。但是,对于任何支持‘热’刷新()调用的现有Spring ApplicationContext (如Spring文档所指的那样),这似乎都很昂贵。
支持“热”刷新的Spring ApplicationContext类从销毁所有单例bean开始。我们的大多数插件都是单个插件,所以每次调用refresh()都会导致大多数插件被销毁,然后是recreated...costly。如果我们不调用refresh,那么我们新加载的插件bean将不会被后处理(例如AOP等.)。
我们可以保证,当我们被迫加载另一个插件时,我们还将加载任何尚未加载的依赖项。因此,在加载的bean定义无效的情况下,我们永远不会执行。
在我看来,这需要一种支持“热”刷新的新型Spring,但只用于添加新的ApplicationContext定义。先前存在的bean定义不会被删除/重新加载,也不会被BeanFactoryPostProcessors在随后的refresh()调用中重新处理,而预先存在的单例也不会被销毁!
这个问题已经存在了吗?有没有更好的解决办法我忽略了?
发布于 2014-02-20 06:08:54
这听起来像是你在找@Lazy。
4.4.4延迟初始化bean
延迟初始化的bean告诉IoC容器在第一次请求时创建bean实例,而不是在启动时。
https://stackoverflow.com/questions/21897827
复制相似问题