您的位置:首页 > 编程语言 > Java开发

如果一个父类有多个子类或者一个接口有多个实现的时候,Spring是如何判断该调用哪个的呢?源码分析如下

2018-01-24 10:50 1066 查看
在doResolveDependency的里面进行调用determinePrimaryCandidate(matchingBeans, descriptor);方法判断







determinePrimaryCandidate(matchingBeans, descriptor);的判断primary如下:



所以,从这里也可以看出Spring在注入的时候是注入的子类和接口的实现类!
多个实现类的时候就要用:@Primary指定优先调用具体的实现类

如果没有指定primary的时候,抛出的异常如下:





org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'searchController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire field: private com.duowan.goa.service.GameSearchService com.duowan.goa.controller.SearchController.gameSearchService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.duowan.goa.service.GameSearchService]
is defined: expected single matching bean but found 2: [gameSearchServiceImpl, testServiceImpl]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) ~[spring-context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) ~[spring-context-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442) ~[spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458) ~[spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339) ~[spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306) ~[spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127) ~[spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at javax.servlet.GenericServlet.init(GenericServlet.java:244) ~[javax.servlet-api-3.0.1.jar:3.0.1]
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:432) [jetty-servlet-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:260) [jetty-servlet-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) [jetty-util-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:762) [jetty-servlet-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:244) [jetty-servlet-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1181) [jetty-webapp-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:584) [jetty-server-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:496) [jetty-webapp-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) [jetty-util-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:93) [jetty-server-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.server.Server.doStart(Server.java:243) [jetty-server-7.2.2.v20101205.jar:7.2.2.v20101205]
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:55) [jetty-util-7.2.2.v20101205.jar:7.2.2.v20101205]
at com.duowan.goa.tools.GoaHomeJetty.main(GoaHomeJetty.java:30) [test-classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.duowan.goa.service.GameSearchService com.duowan.goa.controller.SearchController.gameSearchService;
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.duowan.goa.service.GameSearchService] is defined: expected single matching bean but found 2: [gameSearchServiceImpl, testServiceImpl]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:502) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:282) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
... 29 common frames omitted
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.duowan.goa.service.GameSearchService] is defined: expected single matching bean but found
2: [gameSearchServiceImpl, testServiceImpl]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:796) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:474) ~[spring-beans-3.0.5.RELEASE.jar:3.0.5.RELEASE]
... 31 common frames omitted
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring java
相关文章推荐