java - 如何延迟注册 Spring 'bean definitions' 以缩短启动时间?

标签 java spring

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

问题是启动时间很长(仅加载插件 bean 定义大约需要 6.5 分钟)。我们希望将此加载时间分散到更长的时间内,而我们的应用程序实际上正在利用已经注册了 Bean 定义的插件来处理其他请求。大多数插件很少使用。因此,我们真的很想延迟注册我们的 bean 定义(这与我们今天已经做的单例 bean 的延迟初始化不同)。然而,对于任何支持“热”refresh() 调用(如 Spring 文档所指)的现有 Spring ApplicationContext 来说,这似乎成本高昂。

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

我们可以保证,当我们被迫加载另一个插件时,我们还将加载其尚未加载的任何依赖项。因此,我们永远不会遇到加载的 bean 定义无效的情况。

在我看来,这需要一种支持“热”刷新的新型 Spring ApplicationContext,但仅用于添加新的 bean 定义。预先存在的 bean 定义不会被删除/重新加载,并且不会在后续的刷新()调用中由 BeanFactoryPostProcessors 重新处理,并且预先存在的单例也不会被破坏!

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

最佳答案

这听起来像是您正在寻找 @Lazy .

4.4.4 Lazy-initialized beans

A lazy-initialized bean tells the IoC container to create a bean instance when it is first requested, rather than at startup.

关于java - 如何延迟注册 Spring 'bean definitions' 以缩短启动时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21897827/

相关文章:

java - 在运行时更改 Spring 任务的预定时间?

java - 参数化批量插入到Spring JDBC中

java - 使用 Spring JDBC 获取 SQL 插入后生成的 key

Java servlet : request. getParameter 和 request.setAttribute 以我不理解的方式连接

spring - 使用 Spring Security 对现有和不存在的用户进行时不变查询

JUNIT 测试时出现 java.lang.StackOverflowError

java - 来自 == 运算符的 "Invalid assignment"错误

java - Spring 和 Jquery

java - java中的BitSet存储的是位还是整数?

java - 为什么实现接口(interface)(使用默认方法)的顺序在 Java 8 中很重要?