当多个Spring bean定义了相同的名称时,哪个会隐藏其他bean?
假设我有几个类在包org.example中使用注释@Component("bean")进行了注释,还有一个包含以下内容的applicationContext.xml:
当我执行
根据Spring文档:
每个bean都有一个或多个标识符。这些标识符必须在托管bean的容器内是唯一的。
但是,我知道(因为我测试过),当这样做时,Spring不会抱怨。一个定义将隐藏其他定义。但我找不到规则是什么。
我想出于测试目的这样做。我使用基于注释的配置来定义真正的(生产)bean。然后,我想使用特定于测试的XML配置文件来覆盖这些定义并注入模拟bean。
编辑:由于您中的几位要求日志,我花了一些时间创建了一些。以下是它们:
假设我有几个类在包org.example中使用注释@Component("bean")进行了注释,还有一个包含以下内容的applicationContext.xml:
<context:component-scan base-package="org.example"/>
<alias name="aliasedBean" alias="bean"/>
<bean id="aliasedBean" class="org.example.AliasedBean"/>
<bean id="bean" class="org.example.XmlBean"/>
<import resource="otherApplicationContext.xml"/>
当我执行
applicationContext.getBean("bean")
时,将检索哪个bean?根据Spring文档:
每个bean都有一个或多个标识符。这些标识符必须在托管bean的容器内是唯一的。
但是,我知道(因为我测试过),当这样做时,Spring不会抱怨。一个定义将隐藏其他定义。但我找不到规则是什么。
我想出于测试目的这样做。我使用基于注释的配置来定义真正的(生产)bean。然后,我想使用特定于测试的XML配置文件来覆盖这些定义并注入模拟bean。
编辑:由于您中的几位要求日志,我花了一些时间创建了一些。以下是它们:
0 INFO org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3934f69a: startup date [Wed Mar 06 23:04:35 CET 2013]; root of context hierarchy
45 INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
223 INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Overriding bean definition for bean 'bean': replacing [Generic bean: class [org.example.AnnotatedBean]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/Users/etienne/Documents/Développement/Registre/workspace/SpringPrecedence/target/classes/org/example/AnnotatedBean.class]] with [Generic bean: class [org.example.XmlBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [applicationContext.xml]]
223 INFO org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [otherApplicationContext.xml]
246 INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Overriding bean definition for bean 'bean': replacing [Generic bean: class [org.example.XmlBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [applicationContext.xml]] with [Generic bean: class [org.example.ImportedXmlBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [otherApplicationContext.xml]]
290 INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6aba4211: defining beans [bean,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,aliasedBean,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
290 INFO org.example.AliasedBean - Construction of AliasedBean.
302 INFO org.example.Main - Application context loaded.
302 INFO org.springframework.context.support.ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@3934f69a: startup date [Wed Mar 06 23:04:35 CET 2013]; root of context hierarchy
302 INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6aba4211: defining beans [bean,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,aliasedBean,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
经过一些测试,我发现在创建上下文时会出现异常,如果:
- 我有两个
@Component("bean")
或者 - 我在同一个XML文件中有两个
<bean id="bean"/>
元素。