2008-11-26 18 views
24

Estoy revisando algunos códigos de Spring, y veo algunos defys de frijoles que no tienen una identificación o un nombre. La persona que lo hizo no está para preguntar. La aplicación funciona bien. No estoy familiarizado con lo que esto significa necesariamente. ¿Alguien sabe si esto significa algo en particular?Frijol de primavera sin identificación o nombre

+0

considere poner un ejemplo de definición - sin ver la definición en el contexto, es difícil dar una respuesta concreta. –

+0

Si no se proporciona un nombre explícitamente, el contenedor generará un nombre único para ese bean. – lolotron

+4

De forma predeterminada, la ID del bean se generará por camel-casing el nombre de la clase. – lolotron

Respuesta

20

Algunos beans no son necesarios para acceder a otros beans en el archivo de contexto o programáticamente. Como lo menciona JacobM, no requieren una identificación o nombre ya que no están referenciados.

Un ejemplo de este tipo sería PropertyPlaceholderConfigurer, que lee un archivo de propiedades y permite el reemplazo de propiedades en tiempo de ejecución en la definición de contexto.

La definición ejemplo sería

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="myapp.properties" /> 
</bean> 

el Javadoc proporciona documentación adicional sobre este objeto, pero más adelante en el archivo que puede hacer referencia a las propiedades de su archivo con sólo usar la plantilla estándar se sustituye espacio $ {.. .}.

7

Una posibilidad es que pueda definir un bean en su lugar y, por lo tanto, no necesita un ID, ya que no necesita consultarlo desde ningún otro lugar. Decir que tengo un objeto que se lleva a Foo una propiedad Bar:

<bean id="foo" class="Foo"> 
    <property name="bar"> 
     <bean class="Bar"> 
    </property> 
</bean> 

El grano de barra no necesita un nombre, ya que sólo se usa para establecer que una propiedad.

5

Compruebe la posibilidad de auto-cableado. Otro bean podría hacer referencia al bean sin nombre al tener la propiedad de autowire establecida en byType.

Esto es sólo una suposición. Sin un ejemplo concreto, no puedo decir nada más.

1

Los frijoles sin identificación o nombre todavía pueden ser referenciados por el nombre de clase. Spring nombra esos beans automáticamente utilizando el nombre de la clase y si hay más de un bean de la misma clase, les agrega un número. Por lo general, los beans anónimos se definen dentro de una etiqueta de propiedad, pero si solo están allí, tal vez haya un autoconfigurado configurado en algunos otros beans. De todos modos, creo que agregar un nombre o una identificación a esos beans no romperá su aplicación.

1

Como un par de personas mencionadas anteriormente, no todas las tomas de frijoles se basan en nombre/ID; algo de esto se basa en el tipo. Por ejemplo, hay un método

BeanFactoryUtils.beansOfTypeIncludingAncestors (...)

que atrapa todos los granos de algún tipo determinado. Esto es utilizado, por ejemplo, por Spring Web MVC DispatcherServlet (entre muchos otros lugares) para descubrir beans por tipo, como HandlerMappings, HandlerAdapters, HandlerExceptionResolvers, etc. Contraste esto con los casos en que el bean debe tener un nombre/ID conocido específico que se debe encontrar, como LocaleResolver (ID debe ser "localeResolver" o no se encontrará) y ThemeResolver (ID debe ser "themeResolver" o no será encontrado).

1

Beans definidos sin nombre y ID se puede acceder con un ID generado (nombre completo del paquete y nombre de la clase), por ejemplo:

bean define como

<bean class="pl.finsys.initOrder.TestBeanImpl"> 

se puede acceder por

TestBean bean = (TestBean) ctx.getBean("pl.finsys.initOrder.TestBeanImpl"); 
1
archivo

// frijol cfg sin bean id

<bean class="com.ds.DemoBean"> <property name="msg" value="Hello"/> </bean>

// Podemos acceder a

objeto obj = factory.getBean ("com.ds.DemoBe

0

no es un obligatorio proporcionar Java Bean Id..If no estamos proporcionando bean id, nuestra El contenedor proporciona el identificador predeterminado de Id. De haba Id.Default como "(Nombre del paquete). (Nombre de clase de grano) #N" donde N = 0,1,2, ...... etc.

0

Parece que hay una diferencia sutil entre el comportamiento del bean sin nombre y el nombre. Si tiene un archivo de configuración XML importado dos veces, cada bean nombrado se creará solo una vez, pero se creará un bean sin nombre tantas veces como se incluya su definición. Cuando se trata de un grano de Autowire tales por tipo, que conduce a errores como este:

No qualifying bean of type [your.class.Name] is defined: expected single matching bean but found 4 
Cuestiones relacionadas