Что работает
Предположим, что у меня есть определение весной боб в ArrayList:Как я могу ввести экземпляр List в Spring?
<bean id="availableLanguages" class="java.util.ArrayList">
<constructor-arg>
<bean class="java.util.Arrays" factory-method="asList">
<constructor-arg>
<list>
<value>de</value>
<value>en</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
Теперь я могу вводить это во все виды бобов, например например:
@Controller
class Controller {
@Autowired
public Controller(ArrayList<String> availableLanguages) {
// ...
}
}
Это отлично работает.
Как это ломает
Однако, если я изменю мой контроллер крошечные и использовать тип List
вместо ArrayList
так:
@Controller
class Controller {
@Autowired
public Controller(List<String> availableLanguages) {
// ...
}
}
Тогда вместо того, чтобы получить список всех бобов типа String
а не тот, который я определил. Однако на самом деле я хочу, чтобы мой список был помещен в немодифицируемый список, но это будет возможно только в том случае, если я понижу свою зависимость до списка.
До сих пор обнаружили обходной путь
следующий файл XML:
<bean id="availableLanguages" class="java.util.Collections" factory-method="unmodifiableList">
<constructor-arg>
<bean class="java.util.Arrays" factory-method="asList">
<constructor-arg>
<list>
<value>de</value>
<value>en</value>
</list>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
работает вместе с этим контроллером:
@Controller
class Controller {
@Autowired
public Controller(Object availableLanguages) {
List<String> theList = (List<String>)availableLanguages;
}
}
В то время как это работает дополнительный тип броска некрасиво.
Результаты до сих пор
я понял, что есть special handling for collections in Spring 4.2.5 (the currently most recent version), который, кажется, вызывает все проблемы. Это создает особое поведение, когда параметр является интерфейсом, который расширяет Collection
. Таким образом, я могу обходным путем использовать Object
или конкретную реализацию как тип параметра.
Вопрос
Есть ли способ, чтобы непосредственно вводить список в фасоли? Как?
Вы можете использовать пространство имен 'util'. Взгляните на [this] (http://stackoverflow.com/questions/2416056/how-to-define-a-list-bean-in-spring) asnwer. – josivan
@josivan: Насколько я вижу, это изменит способ определения списка. Однако определение списка не является проблемой. Это инъекция, которая вызывает проблему, или мне ничего не хватает о том, что делает «утилита»? – yankee
'util: list' является регулярным компонентом в контексте Spring, вы можете его вводить нормально. Я замечаю, что у вас есть сочетание аннотации и XML, а затем лоток для использования '@ Qualifier' в конструкторе. Например, '@Qualifier (« myList »)' – josivan