[英]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是由FooOneMapper 、 FooTwoMapper和FooThreeMapper扩展的接口。
当我尝试运行该项目时,会抛出以下消息:
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。 确保FooBO
和IFooMapper
没有使用@Component
或其IFooMapper
型注释进行注释。
class FooBO {
private final IFooMapper mapper;
public FooBO(IFooMapper mapper) {
this.mapper = mapper;
}
}
如果由于某种原因您无法删除@Component
。 其他修复方法是使用@Primary
将IFooMapper
的实现之一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.