SpringBoot 使用 @Autowired 注入 接口或抽象类的实现类实例 到Map失败的原因

错误注入方式:

 @Autowired
    private HashMap<String, MySearchStrategy> mySearchStrategyMap;

正确注入方式:

 @Autowired
    private Map<String, MySearchStrategy> mySearchStrategyMap;

也就是说在注入实例时,应当声明存储对象为Map<String, Service>, 不可以使用HashMap<String, Service>;将实例注入List时也是如此,应当声明存储对象为List, 不能使用ArrayList或List的其它实现类。

原因猜测:List、Map都是接口,而HashMap、ArrayList等为接口的实现类,若注入实例声明存储对象为HashMap、ArrayList,则spring会去寻找是否存在HashMap<String, Service>或ArrayList的Bean,显然是没有的,因此会报错 找不到匹配的Bean

Error creating bean with name 'MySearchContext': Unsatisfied dependency expressed through field 'mySearchStrategyMap'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.HashMap<java.lang.String, com.yyd.blog_back.search.strategy.MySearchStrategy>' available: expected at least 1 bean which qualifies as autowire candidate.

而将存储对象声明为Map或List可以成功注入的原因,个人猜测是在spring内部存在着某些继承了这些接口的类,采用这种方式注入时spring就将实例存储在其中并将之交由spring的Bean工厂管理

最后回想一下解决bug的历程:
1、检查是否对相应的类加了注解
2、类名是否与引入的某些框架中的类冲突
3、验证接口和抽象类是否都可以注入实现类实例
4、将自己的代码与正确注入的代码比较,最终锁定问题

以上为自己的一次解决bug的记录,如有错误之处,请在评论区指出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值