1. 程式人生 > >如果一個父類有多個子類或者一個介面有多個實現的時候,Spring是如何判斷該呼叫哪個的呢?原始碼分析如下

如果一個父類有多個子類或者一個介面有多個實現的時候,Spring是如何判斷該呼叫哪個的呢?原始碼分析如下

在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