Spring FactoryBean - 迭代“对象创建”列表

时间:2010-04-12 17:55:24

标签: java spring

圣诞老人得到了一份清单。他想为每个孩子在列表清单上做一个“礼物”(我们暂时假设他们都很好)并将它们全部加载到他的雪橇中。他可以用Spring做到吗?

我编写了一个简单的FileListFactory来实现FactoryBean并返回一个表示给定文件中的行的字符串列表。暂时搁置一边 - 如果我们解决了< list>的问题,那么我假设我可以在其位置插入一个参考这个工厂的输出。

想要的是“foo”对象的列表。 foo对象是某些bean的非单例实例(可能带有抽象bean定义)。创建的每个foo对象都将其中一个列表项作为属性。

为了进一步提高一个级别,所讨论的属性是一个“条形”对象。我已经创建了一个属性编辑器来从字符串中创建“bar”对象。因此,在设置每个实例属性时,迭代字符串列表的事物应该使用属性编辑器基础结构。

似乎应该有某种列表工厂迭代器bean或其他东西。问题似乎是我正在寻找的所有搜索示例解决方案都失败了,因为像“list”这样的术语过于通用了。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你有一个字符串列表(例如从文件中读取)。对于每个字符串,您要创建一个“foo”对象,其中给定的字符串分配给“bar”属性,并进行适当的转换。

您可以通过实施自己的BeanFactoryPostProcessor来实现这一目标。对于每个字符串,创建一个新的BeanDefinition并将其注册到目标工厂。为简化起见,请创建并注册ChildBeanDefinition,提供具有所有通用配置的“父”bean的名称,并仅设置“bar”属性。

答案 1 :(得分:0)

我从来没有回过头来记录我最终结果。

神奇的是,遍历列表的工厂对象是 abstract 。它有一个抽象方法,返回" foo"的实例。在这种情况下:

public abstract Foo createFoo();

尽管这是一个抽象类,但您在Spring XML配置中创建了它的具体实例,但在XML中有一个额外的子节点,如下所示:

<bean id="Santa" class="...">
  <lookup-method name="createFoo" bean="fooFactory"/>
  ...
</bean>

&#34; fooFactory&#34; bean是一个出售Foo对象的工厂。

最终结果是,通过Spring IoC的魔力,你得到的是一个匿名对象,它是抽象类的具体实例,包括引用工厂bean的抽象方法的实现。

Santa类代码只需获取List,迭代它,调用createFoo()获取Foo,然后根据需要调用Foo.setBar()。

Mischief管理好了!