@autowired默认按类型注入,冲突时按名称匹配;推荐构造器注入以保证不可变性和可测试性;多实例用@qualifier指定名称;非必需依赖可用required=false、optional或@nullable处理。

在 Spring 框架中,@Autowired 是最常用的依赖注入注解之一,用于自动装配 Bean 实例到字段、构造器或 setter 方法中。它默认按类型(byType)匹配容器中的 Bean,若存在多个相同类型的 Bean,则进一步按名称(byName)匹配。
基本用法:字段注入(不推荐但常见)
直接在类的私有字段上添加 @Autowired,Spring 会在创建该 Bean 时自动注入匹配的依赖。
示例:
@Service
public class UserService {
@Autowired
private UserMapper userMapper; // 自动注入 UserMapper 类型的 Bean
public User getById(Long id) {
return userMapper.selectById(id);
}
}
⚠️ 注意:字段注入破坏封装性,不利于单元测试,且无法明确表达“该依赖是必需的”——Spring 默认允许注入为 null(除非配置了严格模式)。
推荐方式:构造器注入(推荐)
将依赖声明为 final 字段,并在构造器中使用 @Autowired 注入(Spring 4.3+ 对单构造器可省略注解)。
优点:不可变、线程安全、强制依赖、便于测试。
示例:
@Service
public class UserService {
private final UserMapper userMapper;
public UserService(UserMapper userMapper) { // Spring 自动调用此构造器
this.userMapper = userMapper;
}
// 或显式标注(兼容旧版本)
// @Autowired
// public UserService(UserMapper userMapper) { ... }
}
处理多实例冲突:@Qualifier 配合 @Autowired
当容器中存在多个相同类型的 Bean 时,仅靠类型无法确定注入哪一个,此时需配合 @Qualifier 指定 Bean 名称。
示例:
@Repository("mysqlUserMapper")
public class MysqlUserMapper implements UserMapper { ... }
@Repository("redisUserMapper")
public class RedisUserMapper implements UserMapper { ... }
@Service
public class UserService {
@Autowired
@Qualifier("mysqlUserMapper")
private UserMapper userMapper; // 明确注入 MySQL 实现
}
也可在实现类上用 @Qualifier("xxx") 自定义限定符,或结合自定义注解(如 @Primary 标记首选 Bean)。
可选注入与空值处理
如果某个依赖不是必须的,可以设置 required = false,避免启动报错;但更推荐使用 Optional 或 @Nullable 显式表达可选语义。
-
@Autowired(required = false):字段可能为 null,需手动判空 -
@Autowired private Optional<usermapper> mapper;</usermapper>:更安全,支持ifPresent等操作 - Spring 5.0+ 支持 JSR-305 的
@Nullable,配合 IDE 提示空安全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











