Spring注解-@Autowired注入时有多个同类型的Bean解决方案
对于上一篇文章Spring注解之 @Autowired @Qualifier中第三种情况(无法仅通过类型来区分)
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 方法
}
}
因为 RepositoryA
和 RepositoryB
都是 MyRepository
接口的实现类,Spring 容器中有两个类型相同的 Bean。当我们使用 @Autowired
注入时,Spring 会尝试根据类型自动注入符合条件的 Bean,而此时有两个实现同一个接口的 Bean,Spring 就不知道该选择哪个 Bean 进行注入,因此会抛出 NoUniqueBeanDefinitionException
异常。
通常有两种方式来解决这个问题:
1. 使用 @Qualifier
进行区分
通过使用 @Qualifier
注解,指定要注入的具体 Bean 名称。这告诉 Spring 容器注入的是 repositoryA
而不是 repositoryB
。
@Component
public class MyService {
@Autowired
@Qualifier("repositoryA") // 指定注入名为 "repositoryA" 的 Bean
private MyRepository myRepository;
public void performSave() {
myRepository.save(); // 这里将调用 RepositoryA 的 save 方法
}
}
2. 使用 @Primary
标记一个首选 Bean
如果我们希望在不使用 @Qualifier
的情况下自动注入某个 Bean,可以使用 @Primary
注解,将某个 Bean 标记为首选。当有多个符合类型的 Bean 时,Spring 将优先注入标记为 @Primary
的 Bean。
例如,标记 RepositoryA
为 @Primary
:
@Component
@Primary
public class RepositoryA implements MyRepository {
@Override
public void save() {
System.out.println("Saving in Repository A");
}
}
这样,Spring 在有多个符合条件的 Bean 时会优先选择 RepositoryA
,即使不使用 @Qualifier
,也会自动注入它。
示例:
@Component
public class MyService {
@Autowired
private MyRepository myRepository; // 如果 RepositoryA 被标记为 @Primary,它会被注入
public void performSave() {
myRepository.save(); // 将调用 RepositoryA 的 save 方法
}
}
总结:
- 不能仅通过类型区分,因为多个实现类都是
MyRepository
类型。 - 使用
@Qualifier
可以通过名称指定具体的 Bean。 - 使用
@Primary
可以为某个 Bean 设置优先注入的首选项。
原文地址:https://blog.csdn.net/weixin_43844521/article/details/142931179
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!