@Import 是 Spring 轻量级配置组合工具,支持直接导入配置类或普通类、通过 ImportSelector 动态条件化导入、借助 ImportBeanDefinitionRegistrar 手动注册 Bean,还可封装为自定义注解(如 @EnableRocketMQ)实现模块化启用。

@Import 是 Spring 提供的轻量但功能强大的配置组合工具,它不依赖组件扫描,也不需要被导入类加 @Component,就能把类或配置逻辑精准注入容器。关键在于“按需导入”——不是全盘加载,而是根据结构、条件或运行时信息,有策略地引入。
直接导入配置类或普通类
最常用也最直观的方式:把已有的 @Configuration 类,或甚至只是普通 Java 类(无任何 Spring 注解),通过 @Import 注册为 Bean。
- 导入单个配置类:
@Import(DataSourceConfig.class),该类中所有@Bean方法都会生效 - 导入多个类:
@Import({CacheConfig.class, SecurityConfig.class}) - 导入普通类(如工具类、服务类):
@Import(MyService.class),Spring 会将其作为单例 Bean 注入,ID 默认为全限定类名(如com.example.MyService)
用 ImportSelector 动态选配
当导入逻辑需要判断环境、注解属性或配置项时,用 ImportSelector 实现“条件化导入”。
- 自定义类实现
ImportSelector接口,重写selectImports() - 方法返回字符串数组,内容是待导入类的全类名(注意:不能返回
null,空数组可接受) - 例如:根据
@EnableRocketMQ(mode = "consumer")注解,只导入消费者相关配置类 - 参数
AnnotationMetadata可读取当前配置类上所有注解信息,是做条件判断的数据来源
用 ImportBeanDefinitionRegistrar 手动注册
适用于需要完全掌控 Bean 定义注册过程的场景,比如扫描包路径、生成代理类、批量注册接口实现等。
立即学习“Java免费学习笔记(深入)”;
- 实现
ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions() - 通过
BeanDefinitionRegistry调用registry.registerBeanDefinition()显式注册 - 典型应用:MyBatis 的
@MapperScan、Spring Boot 的自动配置注册器底层都基于此机制 - 可结合
AnnotationMetadata获取自定义注解的属性值,实现高度定制化
与自定义注解配合启用模块
将 @Import 封装进自定义注解,是构建可复用模块的标准做法。
- 定义注解如
@EnableRocketMQ,加上@Import(RocketMQImportRegistrar.class) - 该
ImportBeanDefinitionRegistrar实现类读取注解属性(如topic、group),动态构造并注册 Producer/Consumer Bean - 使用者只需在启动类或配置类上加一行
@EnableRocketMQ(mode="producer"),即可接入整套能力 - 这种方式屏蔽了底层复杂性,同时保留扩展空间,是 Spring Boot
@Enable*系列注解的设计范式


















