Когда я запрограммировал в LISP, я не использовал шаблоны разработки GoF вообще, это просто не было применимо для программ, которые я писал. Теперь я программирую в C# и натыкаюсь на ситуации все время, где шаблон разработки на самом деле упрощает записанную программу.
Ага, вы можете это сделать. фасоль определенного вида из 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
, но список работает хорошо.
Если допустимо заполнить список из кода вашего приложения, а не из внутри файла определения bean-компонента вы можете использовать org.springframework.beans.factory.xml.XmlBeanFactory
и задать ему « getBeansOfType (MyType.class)
». Это дает вам все компоненты типа (и подтипа) MyType
.
Краткий ответ: нет
Длинный ответ: универсальные шаблоны Java работают путем стирания типа, что означает, что во время выполнения этот параметр является просто списком, а не списком универсального типа. Таким образом, вы не можете понять, что это должен быть параметр типа MyType, поэтому реализовать такое поведение было бы невозможно.
При этом есть альтернативные способы сделать это. Самым очевидным, кажется, является прослушивание создания bean-компонентов, а затем проверка того, относятся ли они к MyType (или подклассам), а затем сохранение ссылки.
Вероятно, есть несколько способов сделать это. Один из них - создание постпроцессора bean . Таким образом вы будете получать уведомления о каждом созданном компоненте.
Если вы можете использовать @Autowired
внутри кода для заполнения, вы можете безопасно использовать способ, упомянутый skaffman. Если вы настаиваете на конфигурации XML, для этого есть небольшая библиотека под названием Hera . По сути, конфигурация описанного вами сценария выглядит следующим образом:
<bean id="client" class="..">
<property name="injectDynamicListHere">
<hera:list class="my.custom.SuperType" />
</property>
</bean>
Это внедрит все компоненты Spring верхнего уровня, реализующие SuperType
как List
, в клиентский компонент.