2011-09-09 7 views
5

Tengo una pregunta sobre el escaneo de componentes y el uso de una definición de bean adicional en la configuración XML para la misma clase de servicio en Versión de primavera 3.0.5.RELEASE.¿Comportamiento del resorte al mezclar escaneo de componentes y definición de beans XML para la misma clase?

creé una clase "MyService" anotado con

@Service("myService") 

y no hay una definición de frijol para la misma clase que tiene este aspecto:

<bean id="myService" class="....MyService" /> 

pongo un

System.out.println("MyService has been instantiated"); 

mensaje en el constructor de la clase MyService. Ese mensaje se mostrará en la consola solo una vez, cuando se inicie mi aplicación. Spring parece lo suficientemente inteligente como para detectar que solo puede haber una instancia de esa clase con el id "myService".

Pero incluso cuando cambio la anotación a

@Service("myService2") 

y dejo la definición de frijol xml id para "myService", la clase sólo se pueden crear instancias de una vez.

Mis dos preguntas son:

  1. pesar de que es el comportamiento que en la actualidad que quiero, es que posible mezclar XML de definición de frijol y escaneo componente para una clase, para que se crea una instancia dos veces con diferentes ID de Bean?

  2. ¿Alguien sabe cuál es el mecanismo "detrás de escena" en Spring? ¿Cómo decide Spring cuándo crear una instancia de una clase solo una vez? (Tal vez es sólo que no deja que se mezcle la exploración y definición de frijol componente XML para la misma clase?)

muchas gracias por su ayuda!

Respuesta

6

Su pregunta 2. se puede responder fácilmente. Spring instancia los beans en función de su alcance. El alcance predeterminado es "singleton", sin importar si usa xml o configuración basada en anotaciones. Si declara un bean como scope = prototype, se creará una instancia cada vez que se solicite el bean.

Como anotación:

@Scope(StandardScopes.PROTOTYPE) 

En xml:

<bean .... scope="prototype"> 

Si necesita exactamente dos instancias de un frijol, lo mejor sería declarar dos de ellos con nombres dfiferent en XML Pensaría.

En relación con su pregunta 1, no sé si es posible declarar dos instancias de una clase, una con anotación y otra con XML. ¿Estás seguro de que el escaneo classpath realmente funciona en tu ejemplo? Deje fuera la declaración XML Bean e inténtelo de nuevo, ¿tiene una instancia del bean entonces? Si no es así, primero debe corregir el escaneo del classpath ya que parece no funcionar.

De todos modos, la pregunta más importante: ¿Por qué querrías hacer eso? La combinación de ambos tipos de configuración creará un código que no se puede mantener. No mezcle los tipos de configuraciones, elija solo uno o díganos por qué lo necesita.

1

Puede usar el escaneo de componentes y al mismo tiempo definir el bean en xml. Sin embargo, esto también depende del alcance del frijol.

Lea esto post para obtener más información.

Si el escaneo de componentes está habilitado, Spring intentará crear un bean aunque un bean de esa clase ya haya sido definido en Spring config xml. Sin embargo, si el bean definido en el archivo de configuración de primavera y el bean autodetectado tienen el mismo nombre, Spring no creará un nuevo bean mientras lo haga. Si un bean no tiene un constructor no-args, al menos uno de los constructores debe estar auto-conectado. Si ningún constructor está conectado automáticamente, Spring intentará crear un objeto utilizando el constructor no-args predeterminado.

Cuestiones relacionadas