2009-08-12 11 views
5

He creado un grano de primavera que contiene una lista de otros granos, así:XML Spring frijol interior pregunta

<bean name="InventoryManager" class="InvManager"> 
    <property name="slots"> 
    <bean class="HeadSlot" /> 
    <bean class="ShoulderSlot" /> 
    <!-- ... --> 
    </property> 
</bean> 

El problema, sin embargo, es que en otro lugar he utilizado una anotación @Autowired en otra clase de agarrar una lista de todos los granos que implementan una determinada interfaz que algunos de estos granos de interiores poner en práctica, de este modo:

@Autowired 
public void registerInventoryHandlers(List<InvSlot> slots) { 
    //... do some setup stuff with beans that implement the InvSlot interface. 
} 

el problema aquí es que al parecer los "granos de interiores" definidos en XML no son parte de la lista @Autowired. Sin embargo, dar todos estos nombres de beans de ranura y luego hacer referencia a ellos desde el XML parece innecesario y feo.

¿Hay alguna manera de definir un bean dentro de otro bean, pero no ser un bean "interno"? ¿O hay una mejor manera de manejar este diseño?

Respuesta

5

beans definidos dentro de otros granos son, por definición, las habas "interiores". Los documentos dicen:

Los granos internos siempre son anónimos y siempre tienen el alcance como prototipos. También tenga en cuenta que no es posible inyectar frijoles interiores en frijoles colaboradores que no sean el frijol envolvente.

editado para eliminar materia que estaba mal pensado, irrelevante o simplemente mal

que sugieren que en lugar de la lista de Autowiring InvSlot frijoles, que Autowire usted mismo con el grano InvManager lugar. A continuación, puede solicitar al InvManager la lista de beans InvSlot, mientras mantiene su lista de definiciones internas de bean dentro de la definición InvManager.

+0

¡Ah, todo lo contrario! @Autowired tiene algunos usos sorprendentes y menos conocidos. Para citar la documentación de Spring: "También es posible proporcionar todos los beans de un tipo particular de ApplicationContext agregando la anotación a un campo o método que espera una matriz de ese tipo" –

+0

Bloody hell, por lo que lo hace. Le agradezco señor, me ha enseñado algo nuevo :) – skaffman

+0

Intenté utilizarlo para alimentar una especie de cola de eventos "no es necesario que usted se registre" y pensé que era muy inteligente. Pero luego me encontré con esta lata de gusanos en particular. –

0

He encontrado que usar @Component funciona muy bien.

@Component class InvManager { 
    ... 
    @Autowired 
    public void registerInventoryHandlers(List<InvSlot> slots) { ... } 
} 

y

@Component class HeadSlot implements InvSlot { ... } 

y

@Component class ShoulderSlot implements InvSlot { ... } 

Su configuración se convierte en

<context:component-scan base-package="com.foo.bar"/> 
Cuestiones relacionadas