Бобы списка Spring типом

Когда я запрограммировал в LISP, я не использовал шаблоны разработки GoF вообще, это просто не было применимо для программ, которые я писал. Теперь я программирую в C# и натыкаюсь на ситуации все время, где шаблон разработки на самом деле упрощает записанную программу.

8
задан Jeff Storey 19 September 2009 в 15:41
поделиться

4 ответа

Ага, вы можете это сделать. фасоль определенного вида из ApplicationContext, добавив аннотация к полю или методу, который ожидает массив этого типа.

Обратите внимание, что он говорит, что вам нужно ожидать массив, а не список. Это имеет смысл, поскольку стирание универсального типа означает, что список может не работать во время выполнения. Однако возьмите следующий модульный тест, который работает:

<?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>

и этот модульный тест:

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 {}

}

Итак, официально вы должны автоматически подключать ​​TypeA [] , а не List , но список работает хорошо.

25
ответ дан 3 November 2019 в 13:09
поделиться

Если допустимо заполнить список из кода вашего приложения, а не из внутри файла определения bean-компонента вы можете использовать org.springframework.beans.factory.xml.XmlBeanFactory и задать ему « getBeansOfType (MyType.class) ». Это дает вам все компоненты типа (и подтипа) MyType .

5
ответ дан 3 November 2019 в 13:09
поделиться

Краткий ответ: нет

Длинный ответ: универсальные шаблоны Java работают путем стирания типа, что означает, что во время выполнения этот параметр является просто списком, а не списком универсального типа. Таким образом, вы не можете понять, что это должен быть параметр типа MyType, поэтому реализовать такое поведение было бы невозможно.

При этом есть альтернативные способы сделать это. Самым очевидным, кажется, является прослушивание создания bean-компонентов, а затем проверка того, относятся ли они к MyType (или подклассам), а затем сохранение ссылки.

Вероятно, есть несколько способов сделать это. Один из них - создание постпроцессора bean . Таким образом вы будете получать уведомления о каждом созданном компоненте.

0
ответ дан 3 November 2019 в 13:09
поделиться

Если вы можете использовать @Autowired внутри кода для заполнения, вы можете безопасно использовать способ, упомянутый skaffman. Если вы настаиваете на конфигурации XML, для этого есть небольшая библиотека под названием Hera . По сути, конфигурация описанного вами сценария выглядит следующим образом:

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

Это внедрит все компоненты Spring верхнего уровня, реализующие SuperType как List , в клиентский компонент.

3
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: