Spring @Autowired注入多级继承接口报错如何配置解决?
错误原因
Spring的byType自动注入逻辑是严格匹配字段的类型范围,你的SpellCheckerImpl仅实现了SpellChecker2接口,所以Spring容器中该bean的可匹配类型仅包含Object、SpellChecker2、SpellCheckerImpl本身,并不包含子接口SpellChecker1。当TextEditor需要注入SpellChecker1类型的字段时,Spring找不到符合类型要求的候选bean,因此抛出NoSuchBeanDefinitionException。
解决方案
你可以根据实际业务场景选择以下任意一种方案解决问题:
- 方案1:修改实现类的绑定接口
这是成本最低的方案,因为SpellChecker1继承了SpellChecker2的所有方法定义,只需要调整实现类的接口声明即可,原有实现逻辑不需要做任何改动:
@Service public class SpellCheckerImpl implements SpellChecker1 { public SpellCheckerImpl() { System.out.println("Inside SpellChecker constructor."); } @Override public void checkSpelling() { System.out.println("Inside checkSpelling."); } }
- 方案2:调整注入字段的类型
如果不需要使用SpellChecker1的独有扩展方法,直接将TextEditor中需要注入的字段类型改为SpellChecker2即可:
@Component public class TextEditor { @Autowired private SpellChecker2 spellChecker; public void spellCheck() { spellChecker.checkSpelling(); } }
- 方案3:新增适配类实现SpellChecker1
如果不能修改原有实现类的接口绑定,同时必须保留SpellChecker1的注入类型,可以新增一个适配层对接现有实现:
@Service public class SpellChecker1Adapter implements SpellChecker1 { @Autowired private SpellChecker2 originChecker; @Override public void checkSpelling() { originChecker.checkSpelling(); } }
内容的提问来源于stack exchange,提问作者M. Jamshidi
相关产品推荐
相关产品推荐

