Java 如何懒洋洋地注册Spring';bean定义&x27;为了缩短启动时间?

Java 如何懒洋洋地注册Spring';bean定义&x27;为了缩短启动时间?,java,spring,Java,Spring,我们的Java Web应用程序加载了1000多个插件,这些插件都由我们使用ApplicationContext#registerBeanDefinition()方法注册为SpringBean。这些bean通常具有其他依赖项,我们也使用相同的方法将它们注册为Springbean(总共约7000个SpringBean定义…不包括我们的核心应用程序代码) 问题是启动时间很长(仅加载插件bean定义大约6.5分钟)。当我们的应用程序实际使用已经注册了bean定义的插件处理其他请求时,我们更愿意将这个加载

我们的Java Web应用程序加载了1000多个插件,这些插件都由我们使用ApplicationContext#registerBeanDefinition()方法注册为SpringBean。这些bean通常具有其他依赖项,我们也使用相同的方法将它们注册为Springbean(总共约7000个SpringBean定义…不包括我们的核心应用程序代码)

问题是启动时间很长(仅加载插件bean定义大约6.5分钟)。当我们的应用程序实际使用已经注册了bean定义的插件处理其他请求时,我们更愿意将这个加载时间分配到更长的时间段。大多数插件很少使用。因此,我们真的希望懒洋洋地注册bean定义(这与我们今天已经做的单例bean的懒init不同。但是,对于任何支持'hot'refresh()调用的现有Spring ApplicationContext(如Spring文档所述),这似乎代价高昂

支持“热”刷新的Spring ApplicationContext类从销毁所有单例bean开始。我们的大多数插件都是单例的,因此每次调用refresh()都会导致我们的大多数插件被销毁,然后重新创建……代价高昂。如果我们不调用refresh,那么我们新加载的插件bean将不会被后处理(例如,AOP等等)

我们可以保证,当我们被迫加载另一个插件时,我们也会加载它尚未加载的任何依赖项。因此,在加载的bean定义无效的情况下,我们永远不会放弃

在我看来,这需要一种支持“热”刷新的新型SpringApplicationContext,但只是为了添加新的bean定义。预先存在的bean定义不会被删除/重新加载,也不会在后续的refresh()调用中被BeanFactoryPostProcessors重新处理,并且预先存在的单例不会被销毁


这已经存在了吗?。有没有我忽略的更好的解决方案?

这听起来像是你在寻找的

惰性初始化bean告诉IoC容器在第一次请求时而不是在启动时创建bean实例


我不知道。很好的提示。在Jim的特殊情况下,我甚至会尝试将lazy设置为默认值,并查看系统的反应。这应该是非常快的尝试:对不起,我试图明确这一点。正如我在帖子(第2段)中所说的,我已经在做单例bean的lazyinit了。我想对bean定义进行懒散的注册。没错,我刚刚被7000个bean抓住,“很少使用”。我还在想为什么你的启动时间是几分钟。您知道,如果惰性初始化bean是急切初始化bean的依赖项,那么它们就不再懒惰了吗?我们的启动时间是几分钟,原因如下:1)因为类加载器上启用了加载时间weaver,2)我们加载了大约7000个类,3)我们使用各种形式的javassist和反射来处理这些类,以便动态生成bean定义,因为我们正在加载的类不使用Spring,但我们正在对它们进行调整以动态生成bean定义。