Spring报错No unique bean of type [com.xxx.Task] is defined: expected single matching bean but found 3(

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring报错No unique bean of type [com.xxx.Task] is defined: expected single matching bean but found 3(相关的知识,希望对你有一定的参考价值。

异常

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'aConsumer': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.xxx.Task com.xxx.AConsumer.aConsumer; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.xxx.Task] is defined: expected single matching bean but found 3: [cTask, bTask, aTask]
		at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
		at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
		at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
		at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
		at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
		at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:607)
		at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
		at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:472)
		at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:388)
		at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:293)
		at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
		at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4705)
		at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5168)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
		at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
		at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
		at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1767)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:286)
		at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
		at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
		at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:483)
		at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:286)
		at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
		at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
		at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
		at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
		at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
		at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
		at java.security.AccessController.doPrivileged(Native Method)
		at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
		at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
		at sun.rmi.transport.Transport$1.run(Transport.java:200)
		at sun.rmi.transport.Transport$1.run(Transport.java:197)
		at java.security.AccessController.doPrivileged(Native Method)
		at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
		at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
		at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
		at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
		at java.security.AccessController.doPrivileged(Native Method)
		at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
		at java.lang.Thread.run(Thread.java:748)
	

原因

根据异常提示,我们发现无法注入com.xxx.Task com.xxx.AConsumer.aConsumer,那么去AConsumer类下查看aConsumer的注入情况,发现在AConsumer类中注入了Task类,但名称是aConsumer,同@Service()中指定的名称一致了。

@Service("aConsumer")
public class AConsumer {
    @Autowired
    Task aConsumer;

    public Task getTask(){
        return aConsumer;
    }
}

@Autowired注解表示是按类型注入的,原本应该注入的是aTask,注意在本例还有中aTask、bTask、cTask都继承自Task(没有写出来),所以后面的错误提示No unique bean of type [com.xxx.Task] is defined: expected single matching bean but found 3: [cTask, bTask, aTask],就是期待返回唯一一个匹配的Task子类(即aTask),因为是使用@Autowired注解注入所以会根据类型Task判断,但发现Task有三个子类(cTask、bTask、aTask),而名称却是aConsumer,所以出现如上错误。

更深层次的原因是:如果Task只有一个子类,那么@Autowired注解根据类型注入也不会有问题,但有多个子类,仍然使用@Autowired注解注入,也就是类型相同的情况下,那么就会根据名称进行注入。

解决

使用@Autowired注解注入的时候使用正确的名称aTask,不要与@Service注解上的名称发生冲突。

@Service("aConsumer")
public class AConsumer {
    @Autowired
    Task aTask;

    public Task getTask(){
        return aTask;
    }
}

 

以上是关于Spring报错No unique bean of type [com.xxx.Task] is defined: expected single matching bean but found 3(的主要内容,如果未能解决你的问题,请参考以下文章

No qualifying bean of type报错问题处理

分享知识-快乐自己:intellij Idea报错Could not autowire. No beans of...

spring容器注入一个接口的两个实现类

spring注入时报错::No qualifying bean of type 'xxx.xxMapper'

Spring Batch 解决 Could not autowire. No beans of ‘StepBuilderFactory‘ type found.

IntelliJ idea 报错:Could not autowire,no beans of "XXX" type found