@qualifier用于配合@autowired明确指定多实现类中的具体bean,支持bean名称字符串、自定义限定注解及@primary默认首选三种方式,构造器注入中同样适用。

当一个接口有多个实现类时,Spring 默认无法确定该注入哪一个,这时 @Qualifier 就用来配合 @Autowired 明确指定具体实现类。
用 Bean 名称作为 qualifier 值
Spring 会把类名首字母小写作为默认 Bean 名称。比如 UserServiceImpl 对应的 Bean 名是 userServiceImpl,AdminServiceImpl 对应 adminServiceImpl。
在注入处直接用 @Qualifier("beanName") 指定:
@Autowired
@Qualifier("userServiceImpl")
private UserService userService;
用自定义 @Qualifier 注解(推荐)
更类型安全、语义清晰的方式是定义自己的限定注解:
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface User {
}
然后在实现类上标注:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
@Service
@User
public class UserServiceImpl implements UserService { ... }
@Service
@Admin
public class AdminServiceImpl implements UserService { ... }
注入时使用:
@Autowired @User private UserService userService;
配合 @Primary 避免重复注入报错
如果某个实现类是“默认首选”,可以加 @Primary,这样不加 @Qualifier 也能成功注入:
@Service
@Primary
public class UserServiceImpl implements UserService { ... }
但注意:@Primary 只能有一个,且不能替代 @Qualifier 的精确控制能力。
构造器注入中使用 @Qualifier
推荐优先使用构造器注入,@Qualifier 同样适用:
private final UserService userService;
public UserController(@User UserService userService) {
this.userService = userService;
}
参数上直接标注限定注解,比字段注入更清晰、更易测试。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










