前言
呵呵 同样是 最近同事碰到的一个问题
他不太懂 英语, 看到的说明是 缺少一个 RedisTemplate 的实例, 但是找到了一个 RedisTemplate 的实例
呵呵 和我这里 spring 版本似乎是不太一样, 错误信息 有一些差异
以下环境基于 jdk8 + spring-5.0.4-RELEASE
测试用例
BeanConfig 的实例信息, 容器中提供了一个 LinkedList<Object>
/*** BeanConfig** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 2022-01-22 20:13*/
@Configuration
public class BeanConfig {@Beanpublic LinkedList<Object> list1() {return new LinkedList<>();}}
UserService 里面依赖了一个 LinkedList<String>
@Service
public class UserService {@Resourceprivate LinkedList<String> list;}
启动项目, 错误信息如下
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.LinkedList<java.lang.String>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1509)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:506)at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:484)at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:618)at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:177)at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:318)... 30 common frames omitted
根据 类型 注入
寻找 LinkedList 匹配的 bean, beanFactory
校验 list1 的类型, 发现 类型不兼容, 没有放到 candidates 里面, 最终导致没有注入成功
根据 beanName 注入
调整 BeanConfig 里面的 list1 的方法名为 list, 主要的目的是更新 这个 bean 的名称
然后 UserService 里面的 list 字段, 然后 applicationContext 中存在 list 对应的 bean, 然后 这里走的是 byName 注入, 没有泛型类型的校验, 因此能够 注入成功
完