如果一个父类有多个子类或者一个接口有多个实现的时候,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
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
相关文章推荐
- 在多继承的时候,如果一个类继承同时继承自class A和class B,而class A和B中都有一个函数叫foo(),如何明确的在子类中指出override哪个父类的foo()?
- 一个接口有多个实现类,当调用接口中的方法时,如何判定用的是哪个实现类
- C#中如何判断实例是否继承了某个父类或者实现了某类接口
- 如何判断一个实例或者一个类实现某接口呢?
- c# 如何判断一个类是否实现了某个接口
- 一个调用接口的时候返回不到数据分析的总结
- 输入参数能动态调决定调用哪个实现类 spring的一个特性
- 一个接口被多个实现类实现 执行的时候会执行哪个实现类?
- 实例化一个子类对象赋给父类对象引用或一个实现了接口的类的对象赋给接口的引用的好处
- 子类继承父类的同时又去实现一个成员变量、方法与父类相同的接口,最后调的是谁的成员变量和方法?
- Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
- c# 如何判断一个类是否实现了某个接口
- java中如何让一个子类不能调用从父类继承的方法
- Odoo(OpenERP) 多个子类重载同一个父类方法的执行顺序及如何调用父类的父类方法
- 当对象类型是一个接口的时候,在Eclipse中如果跳转到该接口对应的实现类
- 父类的引用指向子类的对象或者接口指向实现类均是可以的
- 如何让Spring MVC Controller的同一个方法,根据逻辑判断返回JSON或者HTML视图?
- 如何让 Spring MVC Controller 的同一个 URL 请求,根据逻辑判断返回 JSON 或者 HTML 视图?
- java方法重写的时候,一个调用父类还是子类方法的问题
- 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。