@Autowired是Spring实现依赖注入的核心注解,基于类型(byType)自动装配Bean,支持字段、构造器和Setter三种方式,推荐优先使用构造器注入以保障不可变性与可测试性;当存在多个同类型Bean时,需配合@Qualifier或@Primary解决歧义;注入失败主因是目标Bean未被Spring容器管理或类型不匹配。

@Autowired 是 Spring 框架提供的依赖注入(DI)核心注解,用于自动装配 Bean。它不需要手动 new 对象或查找工厂,Spring 容器会在运行时根据类型(byType)或名称(byName)自动将匹配的 Bean 注入到字段、构造器或 setter 方法中。
注入方式:字段、构造器、Setter 三种常见写法
推荐优先使用构造器注入,保证依赖不可变且便于单元测试;字段注入最简洁但不利于测试和调试;Setter 注入适合可选依赖或需要后期重置的场景。
-
构造器注入(推荐):Spring 5+ 支持无 @Autowired 的构造器自动注入(只要类只有一个构造器)
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
} -
字段注入(常用但不推荐用于复杂场景):
@Autowired
private UserRepository userRepository; -
Setter 注入:
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
当有多个同类型 Bean 时如何指定?
如果容器中有多个 UserRepository 实现类(如 JdbcUserRepository、JpaUserRepository),仅靠类型无法唯一匹配,需配合 @Qualifier 或 @Primary 解决歧义。
- 用 @Qualifier("beanName") 明确指定 Bean 名称:
@Autowired
@Qualifier("jpaUserRepository")
private UserRepository userRepository; - 用 @Primary 标记首选 Bean(适用于默认场景):
@Component
@Primary
public class JpaUserRepository implements UserRepository { ... }
注入失败常见原因与应对
@Autowired 失败通常不是语法问题,而是容器未管理目标对象或类型不匹配。
立即学习“Java免费学习笔记(深入)”;
- 目标类没加 @Component / @Service / @Repository 等 Spring 管理注解 → Spring 找不到该 Bean
- 类在 Spring 扫描路径之外 → 检查 @ComponentScan 配置或包结构
- 注入非 Spring 管理的对象(如 new 出来的实例)→ 无法注入,必须由容器创建
- 字段为 private 且没有 setter → 字段注入仍可工作,但构造器或 setter 更可控
- 循环依赖(A 依赖 B,B 又依赖 A)→ Spring 默认支持单例下的 setter/字段注入,但构造器注入会报错
是否必须加 @Autowired?
Spring Boot 2.6+ 默认开启构造器注入推断,若类只有一个构造器,可省略 @Autowired;但多构造器时仍需显式标注。字段注入则必须加 @Autowired(除非用 Lombok 的 @RequiredArgsConstructor 配合 final 字段)。


















