代码之家  ›  专栏  ›  技术社区  ›  nsayer

SpringFactoryBean-迭代“对象创建”列表

  •  0
  • nsayer  · 技术社区  · 14 年前

    圣诞老人有一张单子。他想给历史名单上的每一个孩子做一个“礼物”(我们现在假设他们都很好),然后把他们都放进雪橇里。他能用弹簧吗?

    我编写了一个简单的FileListFactory,它实现了FactoryBean,并返回一个表示给定文件中的行的字符串列表。暂时把这一点放在一边-如果我们解决了列表的问题,那么我想我可以插入一个引用来代替工厂的输出。

    我什么 希望 是“foo”对象的列表。foo对象是一些bean的非单例实例(可能带有抽象bean定义)。创建的每个foo对象都将得到一个列表项作为属性。

    为了把赌注再提高一个水平,所讨论的财产是一个“条形”物体。我已经创建了一个属性编辑器来从字符串中创建“bar”对象。因此,在设置每个实例属性时,对字符串列表进行迭代的操作应该使用属性编辑器基础结构。

    似乎应该有某种列表工厂迭代器bean或者类似的东西。问题似乎是我所做的所有搜索都是为了寻找这个失败的解决方案,因为像“list”这样的术语太通用了。

    2 回复  |  直到 9 年前
        1
  •  0
  •   lexicore    14 年前

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

    您可以通过实现自己的 BeanFactoryPostProcessor . 对于每个字符串,创建一个新的 BeanDefinition 并在目标工厂注册。要简化操作,请创建并注册 ChildBeanDefinition ,为“parent”bean的名称提供所有通用配置,并且只设置“bar”属性。

        2
  •  0
  •   nsayer    9 年前

    我从来没有回来记录我的结局。

    神奇的是,迭代列表的工厂对象是 摘要 . 它有一个返回“foo”实例的抽象方法。在这种情况下:

    public abstract Foo createFoo();
    

    尽管这是一个抽象类,但是您在SpringXML配置中创建了一个具体的实例,但是在XML中有一个额外的子节点,看起来像这样:

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

    “foo factory”bean是一个出售foo对象的工厂。

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

    Santa类代码只需获取列表,迭代列表,调用CreateFoo()获取foo,然后根据需要调用foo.setbar()。

    恶作剧成功了!