Micronaut依赖注入异常:多个Bean候选者问题咨询
依赖注入父类时的歧义问题
问题场景
我有如下类结构:
@Singleton public class Parent{}
@Singleton public class Child1 extends Parent{}
@Singleton public class Child2 extends Parent{}
现在我想在另一个类中注入Parent类,代码如下:
public class Test{ @Inject Parent P; }
但这会抛出DependencyInjectionException,提示存在Child1和Child2两个候选Bean。既然Parent是具体类,为何不能直接注入它?
问题原因与解决方法
这是因为依赖注入容器在匹配注入类型时,会把所有与目标类型兼容的Bean都纳入候选范围——不仅是Parent本身,它的子类Child1、Child2因为继承了Parent,也会被视为Parent类型的候选Bean。
虽然Parent是加了@Singleton的具体类,但容器不会默认优先选择父类本身,而是会把所有符合类型要求的Bean都列出来。当存在多个候选时,容器无法自动判断你要注入哪一个,就会抛出歧义性的异常。
要解决这个问题,有几种实用方式:
- 给Parent类添加自定义限定符注解,注入时带上该限定符,明确告诉容器要注入Parent实例。
- 如果不需要子类作为Parent类型的候选,可以给Child1、Child2加上
@Typed注解,限定它们的公开类型仅为自身,比如:
这样容器就不会把它们当作Parent类型的候选了。@Singleton @Typed(Child1.class) public class Child1 extends Parent{} - 注入时使用
Instance<Parent>,手动筛选你需要的实例,比如通过限定符或者类名判断:public class Test{ @Inject @Any Instance<Parent> parentInstance; public void getParent() { Parent p = parentInstance.select(Parent.class).get(); } }
内容的提问来源于stack exchange,提问作者Kunal gupta
相关产品推荐
相关产品推荐

