在 Spring 框架中,@Autowired
和 @Qualifier
是两个常用注解,用于依赖注入(Dependency Injection)时选择和管理 Spring 容器中的 Bean。
1. @Autowired
@Autowired
注解用于自动注入依赖项。Spring 容器会自动将符合类型的 Bean 注入到带有 @Autowired
注解的字段、构造器或方法中。
使用方式:
@Component
public class MyService {
@Autowired
private MyRepository myRepository; // 自动注入 MyRepository 类型的 Bean
// 或者可以在构造器上使用
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
// 或者在方法上使用
@Autowired
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository;
}
}
2. @Qualifier
当有多个符合条件的 Bean 时,@Autowired
可能不知道该注入哪一个。@Qualifier
注解用于在有多个符合条件的 Bean 时,指定要注入的 Bean 名称,从而解决冲突。
使用方式:
@Component
public class MyService {
@Autowired
@Qualifier("specificRepository") // 指定 Bean 名称为 "specificRepository" 的 Bean
private MyRepository myRepository;
// 也可以在构造器注入中使用
@Autowired
public MyService(@Qualifier("specificRepository") MyRepository myRepository) {
this.myRepository = myRepository;
}
}
3. @Autowired
和 @Qualifier
结合使用
在某些情况下,Spring 容器中可能有多个符合注入条件的 Bean,例如多个实现相同接口的 Bean。这时,@Autowired
只提供按类型注入,而 @Qualifier
允许按名称注入特定的 Bean。
示例:
public interface MyRepository {
void save();
}
@Component("repositoryA")
public class RepositoryA implements MyRepository {
@Override
public void save() {
System.out.println("Saving in Repository A");
}
}
@Component("repositoryB")
public class RepositoryB implements MyRepository {
@Override
public void save() {
System.out.println("Saving in Repository B");
}
}
@Component
public class MyService {
@Autowired
@Qualifier("repositoryA") // 指定注入名为 "repositoryA" 的 Bean
private MyRepository myRepository;
public void performSave() {
myRepository.save(); // 这里将调用 RepositoryA 的 save 方法
}
}
总结:
@Autowired
用于自动注入符合类型的 Bean。@Qualifier
用于解决多个符合条件的 Bean 时的冲突,指定注入哪个 Bean。- 两者结合使用可以在复杂的依赖注入场景下更精确地控制 Bean 的注入。