2016-03-19 1 views
5

Что работает

Предположим, что у меня есть определение весной боб в 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 или конкретную реализацию как тип параметра.

Вопрос

Есть ли способ, чтобы непосредственно вводить список в фасоли? Как?

+0

Вы можете использовать пространство имен 'util'. Взгляните на [this] (http://stackoverflow.com/questions/2416056/how-to-define-a-list-bean-in-spring) asnwer. – josivan

+0

@josivan: Насколько я вижу, это изменит способ определения списка. Однако определение списка не является проблемой. Это инъекция, которая вызывает проблему, или мне ничего не хватает о том, что делает «утилита»? – yankee

+0

'util: list' является регулярным компонентом в контексте Spring, вы можете его вводить нормально. Я замечаю, что у вас есть сочетание аннотации и XML, а затем лоток для использования '@ Qualifier' в конструкторе. Например, '@Qualifier (« myList »)' – josivan

ответ

0

Использование @Qualifier будет вставлять bean-компонент с заданным определителем. Вы можете назвать список, который вы хотите быть компонентом, и это будет работать нормально.

Смежные вопросы