Pregunta

¿Hay alguna manera en la primavera que puedo auto rellenar una lista con todos los granos de un tipo y cualquiera de sus subtipos? Tengo un método de selección que se parece a:

setMyProp(List<MyType> list)

Y me gustaría Autowire en cualquier granos de MyType y todas las subclases de MyType.

Gracias, Jeff

¿Fue útil?

Solución

Sí, usted puede hacer esto. Los documentos de primavera dicen:

  

También es posible proporcionar todos   habas de un tipo particular de la   ApplicationContext añadiendo el   anotación a un campo o método que   espera una matriz de ese tipo.

Tenga en cuenta que dice que tienes que esperar una matriz, no es una lista. Esto tiene sentido, porque el tipo genérico borrado significa una lista puede no funcionar en tiempo de ejecución. Sin embargo, tomar la siguiente prueba de la unidad, que funciona:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  

    <bean class="test.Test.TypeB"/>
    <bean class="test.Test.TypeC"/>
    <bean class="test.Test.TypeD"/>
</beans>

y esto prueba de unidad:

package test;

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class Test {

    private @Autowired List<TypeA> beans;

    @org.junit.Test
    public void test() {
        assertNotNull(beans);
        assertEquals(2, beans.size());
        for (TypeA bean : beans) {
            assertTrue(bean instanceof TypeA);
        }
    }       

    public static interface TypeA {}
    public static class TypeB implements TypeA {}
    public static class TypeC extends TypeB {}
    public static class TypeD {}

}

Así que oficialmente, que se supone que Autowire TypeA[], no List<TypeA>, pero la lista funciona bien.

Otros consejos

Si es aceptable para llenar la lista de su código de aplicación y no desde dentro del archivo de definición de frijol podría utilizar el org.springframework.beans.factory.xml.XmlBeanFactory y pedirle que "getBeansOfType( MyType.class )". Esto le da todos los granos de tipo (y subtipo) de MyType.

Si puede utilizar @Autowired dentro del código a poblarse se puede utilizar con seguridad la forma mencionada por skaffman. Si insiste en configuración XML hay una pequeña biblioteca llamada Hera para lograrlo. configuración de absoluto se refiere a un escenario descrito por que se parece a esto:

<bean id="client" class="..">
    <property name="injectDynamicListHere">
        <hera:list class="my.custom.SuperType" />
    </property>
</bean>

Esto inyectará todos los granos de alto nivel de la primavera de aplicación SuperType como List en el grano de cliente.

Respuesta corta:. No

Respuesta larga: genéricos de Java funcionan según el tipo de borrado, lo que significa que en tiempo de ejecución que el parámetro es simplemente una lista, no una lista de un tipo genérico. Como tal no se puede averiguar que está destinado a ser del tipo de parámetro MyType por lo que no sería posible implementar este comportamiento.

Una vez dicho esto, hay maneras alternativas de hacer esto. La más obvia parece ser que escuchar para la creación de frijoles y luego ver si son de MyType (o subclases) y luego mantener una referencia.

Probablemente hay algunas maneras de hacer esto. Uno es la creación de un post-procesador de frijol . De esta manera recibirán una notificación de cada grano que se crea.

Debido al código heredado y desaparecidos @Autowired lo resuelvo como:

MyBean implements ApplicationContextAware{

  @Override
  public void setApplicationContext(ApplicationContext ctx) throws BeansException {
    final Map<String, HttpRequestHandlerTemplate> beansOfType = ctx.getBeansOfType(RequiredBean.class);
    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top