错误注入方式:
@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的记录,如有错误之处,请在评论区指出