自学内容网 自学内容网

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 方法
    }
}

因为 RepositoryARepositoryB 都是 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)!