@Import 是 Spring 提供的快速注册 Bean 的注解,支持导入普通 Java 类、@Configuration 类、ImportSelector 或 ImportBeanDefinitionRegistrar 实现类,不依赖 stereotype 注解或组件扫描。

@Import 是 Spring 提供的用于快速向容器注册 Bean 的注解,它不依赖类是否加了 @Component 或其他 stereotype 注解,也不要求类必须是配置类(@Configuration)。它可以导入三类目标:普通 Java 类、@Configuration 配置类、实现了 ImportSelector 或 ImportBeanDefinitionRegistrar 的类。
导入普通类(无注解的 POJO)
如果一个普通类(比如 UserService)没有加任何 Spring 注解,直接用 @Import(UserService.class),Spring 会把它当作一个“组件”注册进容器,Bean 名默认为类名首字母小写(userService),类型就是该类本身。
注意:这类类不能有带参构造器(除非你同时提供无参构造器或使用 ImportBeanDefinitionRegistrar 自定义注册逻辑),否则会因无法实例化而报错。
- 支持无参构造器的普通类可直接导入
- 若含
@Bean方法,不会被识别(因为不是@Configuration类) - 不会触发组件扫描,完全由
@Import主动注册
导入 @Configuration 配置类
这是最常用的方式。被 @Import 引入的 @Configuration 类,其内部的 @Bean 方法会被执行,所有返回的 Bean 都会注册到容器中,行为与直接在主配置类中定义等效。
立即学习“Java免费学习笔记(深入)”;
例如:
```java@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}
在启动类或主配置类上写:@Import(DatabaseConfig.class),即可将 dataSource 注入容器。
- 被导入的配置类无需
@Configuration也能生效(Spring 5.2+ 后,即使只是普通类 +@Bean方法,也会被处理) - 导入顺序不影响 Bean 创建顺序,但可通过
@DependsOn或方法参数依赖控制
导入 ImportSelector 或 ImportBeanDefinitionRegistrar
当需要动态决定导入哪些类,或需要精细控制 Bean 定义(如条件注册、泛型 Bean、别名设置),就用这两种扩展方式:
-
ImportSelector:返回一个全限定类名数组,Spring 会自动导入这些类(可以是普通类或配置类) -
ImportBeanDefinitionRegistrar:在注册阶段直接操作BeanDefinitionRegistry,可编程式注册任意 Bean,包括设置作用域、代理模式、构造参数等
例如实现条件导入:
```javapublic class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
if (someCondition()) {
return new String[]{RedisConfig.class.getName()};
}
return new String[0];
}
}
注意事项和常见误区
-
@Import只能写在类上(如启动类、配置类),不能写在方法或字段上 - 重复导入同一类不会报错,但也不会重复注册 Bean(容器内 Bean 名唯一)
- 导入的类若本身也用了
@Import,会递归处理(Spring 自动支持) - 不推荐用
@Import替代组件扫描,它更适合模块化、可插拔的配置组装


















