@Import 是 Spring Boot 动态配置注入的核心机制,通过 ImportSelector 或 DeferredImportSelector 在启动早期按需加载配置类,支持条件筛选、profile 判断与类存在性检查,并被广泛用于 @EnableXxx 注解和自动配置。

@Import 是 Spring Boot 实现动态配置注入的核心机制之一,它不靠硬编码写死类名,而是通过扩展接口在启动时按需决定加载哪些配置。关键在于用对方式、看清时机、避开限制。
用 ImportSelector 动态选类
实现 ImportSelector 接口,重写 selectImports 方法,返回要加载的配置类全限定名数组:
- 方法参数 AnnotationMetadata 可读取当前
@EnableXxx注解的属性(比如@EnableMyFeature(enabled = true)) - 可结合 Environment 判断 profile:
environment.acceptsProfiles("prod") - 可检查类是否存在:
ClassUtils.isPresent("org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration", getClass().getClassLoader()) - 返回的类即使没加
@Configuration,也会被当作配置类处理
注意执行时机和能用的资源
ImportSelector 在 ConfigurationClassPostProcessor 阶段早期运行,早于 BeanFactory 初始化:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 可以安全注入 Environment、BeanFactory、ResourceLoader 等基础设施 Bean
- 不能直接
@Autowired普通业务 Bean(如 Service、Repository),会报空指针或循环依赖 - 若需等所有
@Configuration解析完再决策,改用 DeferredImportSelector - 返回的类名必须能被 ClassLoader 加载,否则启动失败
配合自定义启用注解使用
这是 Spring Boot Starter 和 @Enable* 注解的标准模式:
- 定义一个启用注解,比如
@EnableMyModule,里面用@Import(MyModuleImportSelector.class) - 在配置类或启动类上加
@EnableMyModule(enabled = true) -
MyModuleImportSelector.selectImports()从importingClassMetadata中解析enabled属性,决定是否返回"com.example.MyConfig" - 这样既保持调用简洁,又实现开关控制
别忘了 Spring Boot 自动配置的底层也是它
Spring Boot 的 @EnableAutoConfiguration 底层就是 DeferredImportSelector 实现:
- 扫描所有 jar 中
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports - 读取其中的自动配置类列表
- 再结合
@ConditionalOnClass、@ConditionalOnMissingBean等条件过滤 - 最终把符合条件的配置类导入容器 —— 整个过程本质仍是
@Import + Selector的延伸

















