SpringBoot中为什么要用DeferredImportSelector

DeferredImportSelector 是 Spring Framework 3.1 引入的 ImportSelector 接口的增强版本,主要用于延迟加载配置类,提升 Spring Boot 应用的启动速度。 它允许在所有配置类处理完毕后,再根据其他配置类的信息选择性地导入一些配置类。

为什么使用 DeferredImportSelector?

传统的 ImportSelector 会在配置类解析的早期阶段执行,这意味着在选择要导入的配置类时,它可能无法访问完整的配置信息,导致无法做出最佳选择。 DeferredImportSelector 解决了这个问题,它的执行会被延迟到所有常规配置类都被处理之后,此时它可以访问到所有配置类的信息,从而做出更明智的导入决策。

DeferredImportSelector 的工作原理

  1. 注册: 当 Spring 容器解析配置类时,如果发现一个类实现了 DeferredImportSelector 接口,它不会立即执行 selectImports() 方法,而是将该 DeferredImportSelector 的实例注册到一个 DeferredImportSelectorHandler 中。

  2. 延迟执行: 在所有配置类都处理完毕后,DeferredImportSelectorHandler 会负责执行所有注册的 DeferredImportSelector

  3. 分组和排序 (可选): DeferredImportSelector 可以实现 DeferredImportSelector.Group 接口,将多个 DeferredImportSelector 分组,并按组进行排序。 Spring Boot 允许对 DeferredImportSelector.Group 进行排序以控制执行顺序。

  4. selectImports() 方法:selectImports() 方法中,DeferredImportSelector 可以访问到整个 Spring 容器的配置信息,例如:

    • 已经注册的 Bean 定义。
    • 已经加载的配置类。
    • 环境信息 (Environment)。
  5. 返回要导入的配置类: selectImports() 方法返回一个 String 数组,包含了要导入的配置类的全限定名。 Spring 容器会根据这些全限定名来导入相应的配置类,并注册 Bean。

DeferredImportSelector 的优势

  • 延迟加载: 避免过早加载不必要的配置类,提升启动速度。
  • 更智能的配置选择: 基于已加载的配置信息,做出更精确的配置选择。
  • 条件化配置: 实现更复杂的条件化配置逻辑。
  • 排序和分组: 控制 DeferredImportSelector 的执行顺序。

DeferredImportSelector 的劣势

  • 更复杂:ImportSelector 更复杂,需要理解延迟加载和分组排序的机制。
  • 调试难度增加: 由于是延迟执行,调试时可能需要更多步骤。

DeferredImportSelector 的使用场景

  1. 自动配置: Spring Boot 的自动配置机制大量使用了 DeferredImportSelector。 例如, EnableAutoConfiguration 注解使用 AutoConfigurationImportSelector 来选择需要导入的自动配置类。

  2. 条件化配置: 根据某个 Bean 是否存在,或者某个配置属性的值来选择是否导入某个配置类。

  3. 模块化: 将应用分解为多个模块,根据已加载的模块信息来选择导入其他模块的配置。

DeferredImportSelector 的示例

import org.springframework.context.annotation.DeferredImportSelector
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值