Получить доступ ко всем весенним бобам данного типа - PullRequest
7 голосов
/ 09 октября 2010

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

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

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

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

1 Ответ

12 голосов
/ 09 октября 2010

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

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

...