繁体   English   中英

没有类型为 […] IsAvailable 的合格 Bean

[英]No Qualifying Bean of Type […] IsAvailable

我有以下结构:

网络服务

@Autowired
public FooService(@Qualifier("fooMapper1") FooBO fooBO1,
        @Qualifier("fooMapper2") FooBO fooBO2,
        @Qualifier("fooMapper3") FooBO fooBO3) {
    this.fooBO1= fooBO1;
    this.fooBO2= fooBO2;
    this.fooBO3= fooBO3;
}

配置

@Configuration
public class MapperConfig {

    @Bean("fooMapper1")
    public FooBO oneMapper(FooOneMapper mapper) {
        return new FooBO(mapper);
    }
    @Bean("fooMapper2")
    public FooBO twoMapper(FooTwoMapper mapper) {
        return new FooBO(mapper);
    }
    @Bean("fooMapper3")
    public FooBO threeMapper(FooThreeMapper mapper) {
        return new FooBO(mapper);
    }
}

富博

    @Autowired
    public FooBO(IFooMapper mapper) {
        this.mapper = mapper;
    }

IFooMapper是由FooOneMapperFooTwoMapperFooThreeMapper扩展的接口。

当我尝试运行该项目时,会抛出以下消息:

Description:

Parameter 0 of constructor in ...FooBO required a single bean, but 4 were found:
    - FooOneMapper: defined in file [C:...\mapper\FooOneMapper.class]
    - FooTwoMapper: defined in file [C:...\mapper\FooTwoMapper.class]
    - FooThreeMapper: defined in file [C:...\mapper\FooThreeMapper.class]
    - IFooMapper: defined in file [C:...\mapper\IFooMapper.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

我不明白为什么 spring 与所有似乎都配置良好的 bean 有这种冲突。

我猜你已经用@Component注释对FooBO进行@Component注释。

扫描包含 Spring Boot 主类的根包以查找任何带有 @Component 注释的类,并将这些类注册为容器内的 Spring bean 定义

您正在配置类中创建 bean。 确保FooBOIFooMapper没有使用@Component或其IFooMapper型注释进行注释。

class FooBO {

    private final IFooMapper mapper;

    public FooBO(IFooMapper mapper) {
        this.mapper = mapper;
    }
}

如果由于某种原因您无法删除@Component 其他修复方法是使用@PrimaryIFooMapper的实现之一IFooMapper为主要

@Component
@Primary
class FooOneMapper implements IFooMapper{

}

或者提供额外的数据来帮助 spring 解决依赖问题。

public FooBO(@Qualifier("fooThreeMapper") IFooMapper mapper) {
    this.mapper = mapper;
}

首先 Spring 进行扫描以查找它在应用程序上下文中的 bean。 它会找到您的@Configuration ,它创建了三个FooBO类型的FooBO (并且隐式也是IFooMapper类型)。 它还会找到您使用 annotatoins 或在您的 xml 中定义的其他 bean - 所以它会找到IFooMapper 其次,Spring 会找到你的@Autowired FooBO 构造函数,它必须决定你想在那里注入什么 bean。 它的默认策略是根据 bean 的类型进行注入。 所以它看起来在当前上下文中有哪些类型为IFooMapper bean。 它会在您的配置中找到这三个以及您在其他地方声明的任何其他内容。 它抛出异常,因为它无法决定使用哪个实例。 如果您对@Primay一个 bean 进行@Primay那么在这种情况下,Spring 将始终使用该 bean。

额外阅读: Spring bean 生命周期/ Spring 自动装配

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM