7

我有一个 Spring 应用程序(Spring Batch 不是 Web 应用程序)。在测试类中,我想获取对给定类型的所有 bean 的访问权限。

我知道在 Spring 中您通常应该使用 IOC 并让容器注入您的 bean。但是在这种情况下,我想遍历扩展给定类(org.springframework.batch.item.database.JdbcCursorItemReader)的可变数量的bean,并做一些事情(希望它是一个单元/集成测试,只是连接它到数据库并读取 1 行,因此我们可以在测试时确认系统中的所有 JdbcCursorItemReader 都具有有效的 SQL 和行映射器)。

问题 1) 我一次只能得到一个豆子。我可以让我的班级实现 BeanFactoryAware以获取对我的 beanfactory 的引用。然后我可以做beanFactory.getBean("name"); 访问单个 bean。我怎样才能得到所有的豆子?我可以循环并删除那些不是我想要的类的东西。但不知何故,我需要一个 beanfactory 知道的所有 bean 的列表或其他东西。

问题 2)我从 beanfactory 取回的 bean 是代理。如果我尝试转换并使用我的 bean,我会得到类似 java.lang.ClassCastException: $Proxy0 cannot be cast to org.springframework.batch.item.database.JdbcCursorItemReader

4

1 回答 1

12

您可以通过使用ApplicationContextAware而不是解决第一个问题BeanFactoryAware。这将传入ApplicationContext,它具有getBeansOfType()让您检索所有给定类型的 bean 的方法。

第二个问题可能是因为某些东西正在围绕您的JdbcCursorItemReaderbean 创建 AOP 代理。默认情况下,这些生成的代理将实现与JdbcCursorItemReader(特别是ItemReaderItemStream)相同的接口。您的代码不应尝试转换为类类型 ( JdbcCursorItemReader),而是转换为其中一种接口类型。通常可以强制代理直接扩展代理类,但在不了解您的设置的情况下,我无法帮助您。

于 2010-10-09T17:02:28.057 回答