tutorial springframework framework java spring

java - springframework - spring framework 5



¿Cuál es la prioridad de las definiciones de los frijoles de primavera? (1)

  • Los beans se registran en el orden en que se encuentran en el archivo de definición xml.

  • Los beans escaneados se registran en el punto en que se encuentra la etiqueta xml, pero los beans escaneados no pueden anular las definiciones de beans previamente registradas.

  • Las definiciones de beans de Xml pueden anular cualquier definición de bean anterior si DefaultListableBeanFactory.allowBeanDefinitionOverriding es verdadero (de forma predeterminada).

Así que XML gana.

Si coloca primero la etiqueta de componente de escaneo, los beans xml reemplazarán los escaneados. Si lo pones por última vez, los beans escaneados serán ignorados.

Editar

Los alias tienen un comportamiento diferente si se declaran en el atributo de nombre en una definición de bean o se declaran usando la etiqueta de alias.

  • Los alias declarados con la etiqueta de alias ocultan cualquier definición de bean posterior con el mismo nombre.
  • los alias declarados en el atributo de nombre impiden que cualquier otra definición de bean use el mismo nombre lanzando una BeanDefinitionParsingException .

Por ejemplo:

<bean id="foo" name="bar" class="Foo" /> <bean id="bar" class="Bar" /> -- throw Exception (name bar is in use)

pero

<bean id="foo" class="Foo" /> <alias name="foo" alias="bar" /> <bean id="bar" class="Bar" /> -- Hidden by alias no exception thrown

La diferencia es que BeanDefinitionParserDelegate mantiene una lista de nombres y alias en uso en el mismo nivel de bean de anidamiento de elementos de beans y verifica la singularidad del nombre al analizar definiciones de beans.

La etiqueta de alias es procesada directamente por DefaultBeanDefinitionDocumentReader.processAliasRegistration() y el delegado del analizador no conoce estos nombres.

No sé si es un error o intencional, pero la reference no dice nada y parece esperarse que las declaraciones internas y externas de los alias tengan el mismo comportamiento.

Cuando se definen varios frijoles de primavera con el mismo nombre, ¿cuál ocultará los otros?

Digamos que tengo varias clases anotadas con @Component("bean") en el paquete org.example, más un applicationContext.xml que contiene:

<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"/>

¿Qué bean se recuperará cuando realice una applicationContext.getBean("bean") ?

Según la documentación de primavera :

Cada bean tiene uno o más identificadores. Estos identificadores deben ser únicos dentro del contenedor que aloja el bean.

Sin embargo, sé (porque probé) que Spring no se quejará cuando esto se haga. Una definición ocultará las otras. Pero no pude averiguar cuál era la regla.

Quiero hacer esto para propósitos de prueba. Utilizo la configuración basada en anotaciones para definir beans reales (de producción). Luego quiero usar un archivo de configuración XML específico de la prueba para anular estas definiciones e inyectar frijoles simulados.

Edit: Como eran varios los que pedían registros, pasé un tiempo creando algunos. Aquí están ellos:

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

Después de algunas pruebas, descubrí que recibía una excepción durante la creación del contexto si:

  • Tengo dos @Component("bean") o
  • Tengo dos elementos <bean id="bean"/> en el mismo archivo XML.