2010-10-09 3 views
7

У меня есть приложение Spring (Spring Batch not web application). В тестовом классе я хочу получить доступ ко всем моим бобам определенного типа.

Я понимаю, что весной вы, как правило, используете IOC и позволяете контейнеру вводить ваши бобы. Однако в этом случае, я хочу Переберите переменным числом бобов, которые расширяют данный класс (org.springframework.batch.item.database.JdbcCursorItemReader), и сделать что-то (это нужно, чтобы быть блок/интеграционный тест, который просто подключается он в базу данных и читает 1 строку, поэтому во время тестирования мы можем подтвердить, что все JdbcCursorItemReader в системе имеют действительные SQL и строковые преобразователи).Получить доступ ко всем весенним бобам определенного типа

Проблема 1) Я могу только получить бобы один за один раз. Я могу получить свой класс для реализации BeanFactoryAware, чтобы получить ссылку на мою beanfactory. Тогда я могу сделать beanFactory.getBean ("name");, чтобы получить доступ к одному компоненту. Как мне получить ВСЕ Бобы? Я могу зациклиться и отбросить те, которые не являются классом, который я хочу ... но почему-то мне нужен список всех бобин, о которых знает beanfactory или что-то в этом роде.

Проблема 2) Фасоль я вернусь из BeanFactory является прокси. Если я пытаюсь бросить и использовать свой боб я получаю что-то вроде java.lang.ClassCastException: $ Proxy0 не может быть приведен к org.springframework.batch.item.database.JdbcCursorItemReader

ответ

11

Вы можете получить вокруг первой проблемы используя ApplicationContextAware вместо BeanFactoryAware. Это будет проходить в ApplicationContext, который имеет метод getBeansOfType(), который позволяет извлекать все бобы определенного типа.

Вторая проблема, вероятно, вызвана тем, что что-то создает АОП прокси вокруг JdbcCursorItemReader боба. Эти созданные прокси будут по умолчанию реализовывать те же интерфейсы, что и JdbcCursorItemReader (в частности, ItemReader и ItemStream). Ваш код не следует пытаться применять к типу класса (JdbcCursorItemReader), но вместо этого используется один из этих типов интерфейсов. Обычно можно заставить прокси-сервер напрямую распространять прокси-класс, но, не зная ничего о вашей настройке, я не могу с этим поделать.

+0

Могу ли я наложить его на ItemReader и просто использовать его? И волшебство прокси даст мне настоящего читателя? Hummmm spring иногда бывает сложным – bwawok

+1

@bwawok: Да, отличное от «ItemReader» должно работать нормально. Просто не пытайтесь использовать класс JDbcCursorItemReader. – skaffman

+0

@skaffman: но что делать, если я должен сделать что-то подобное ((JdbcCursorItemReader) itemReader) .open (executeContext); –

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