@Autowired

@Autowired 是 Spring 框架提供的核心注解之一,用于自动注入依赖对象,避免手动创建对象实例,实现依赖注入(DI),降低代码耦合度。以下是其详细使用方法和注意事项:

一、基本使用场景

@Autowired 可以标注在字段、构造方法、setter 方法上,Spring 会自动从容器中查找匹配的 bean 并注入。

1. 标注在字段上(最常用)

直接在类的成员变量上使用 @Autowired,Spring 会自动注入对应的 bean:

@Service
public class UserService {
    // 自动注入 UserRepository 类型的 bean
    @Autowired
    private UserRepository userRepository;

    public User findUserById(Integer id) {
        return userRepository.findById(id); // 直接使用注入的对象
    }
}

2. 标注在构造方法上

在构造方法上使用 @Autowired,Spring 会在创建对象时通过构造方法注入依赖(推荐用于必需的依赖):

@Service
public class UserService {
    private final UserRepository userRepository;

    // 构造方法注入(Spring 4.3+ 对单构造方法可省略 @Autowired)
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

**优势**-   依赖在对象创建时就已初始化,避免 `null` 风险。
-   便于单元测试时通过构造方法手动传入 mock 对象。

3. 标注在 setter 方法上

在 setter 方法上使用 @Autowired,Spring 会调用该方法注入依赖(适用于可选依赖):

@Service
public class UserService {
    private UserRepository userRepository;

    // setter 方法注入
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

二、依赖匹配规则

@Autowired 默认按照类型(Type) 匹配 bean,若容器中存在多个同类型的 bean,会按以下规则处理:

1. 按名称(Name)匹配

当存在多个同类型 bean 时,可通过 @Qualifier 注解指定 bean 的名称:

@Service
public class UserService {
    // 容器中存在多个 UserRepository 类型的 bean(如 userRepo1、userRepo2)
    @Autowired
    @Qualifier("userRepo1") // 指定注入名称为 userRepo1 的 bean
    private UserRepository userRepository;
}
-   被注入的 bean 需要指定名称(如 `@Repository("userRepo1")`)。

2. 按 @Primary 优先注入

若某个 bean 被 @Primary 标注,当存在多个同类型 bean 时,会优先注入该 bean:

// 定义两个同类型的 bean
@Repository
@Primary // 优先注入
public class UserRepositoryImpl implements UserRepository { ... }

@Repository
public class AnotherUserRepository implements UserRepository { ... }

// 注入时会优先选择 UserRepositoryImpl
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository; // 实际注入的是 UserRepositoryImpl
}

三、非必需依赖(允许为 null)

默认情况下,@Autowired 要求依赖必须存在,否则会抛出 NoSuchBeanDefinitionException。若依赖是可选的,可通过 required = false 允许为 null

@Service
public class UserService {
    // 允许 userRepository 为 null(不存在时不报错)
    @Autowired(required = false)
    private UserRepository userRepository;

    public User findUserById(Integer id) {
        if (userRepository != null) { // 需判断非空
            return userRepository.findById(id);
        }
        return null;
    }
}

四、注意事项

  1. 注入的是 Spring 容器中的 bean
    被注入的对象必须是被 Spring 管理的 bean(即通过 @Component@Service@Repository@Controller 等注解声明,或在配置类中通过 @Bean 定义)。

  2. 避免循环依赖
    若 A 依赖 B,B 又依赖 A,会导致循环依赖。Spring 可解决构造方法以外的循环依赖,但应尽量避免设计上的循环依赖。

  3. 接口注入优先
    注入时建议使用接口类型而非实现类,例如注入 UserRepository 接口而非其实现类 UserRepositoryImpl,符合依赖倒置原则。

  4. @Resource 的区别

    • @Autowired 是 Spring 注解,默认按类型匹配,支持 @Qualifier@Primary
    • @Resource 是 Java EE 注解,默认按名称匹配,不支持 Spring 的特有功能(如 @Primary)。

五、总结

@Autowired 的核心作用是自动注入 Spring 容器中的依赖 bean,使用时需注意:

  • 可标注在字段、构造方法、setter 方法上,推荐构造方法注入(强制依赖)。
  • 多实例匹配时,用 @Qualifier 指定名称或 @Primary 标记优先 bean。
  • 非必需依赖添加 required = false,避免注入失败。

合理使用 @Autowired 可大幅减少手动管理依赖的代码,提高系统的灵活性和可维护性。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!