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

Spring:获取FactoryBean对象而不是FactoryBean.GetObject()。

  •  12
  • FoxyBOA  · 技术社区  · 15 年前

    简短的问题: 如果我有一个驱动FactoryBean接口的类,那么如何从FactoryBean对象本身而不是FactoryBean.getObject()中获取呢?

    长问题: 我必须使用第三方基于Spring的库,它几乎不使用FactoryBean接口。现在我必须配置2个bean:

    <!-- Case 1-->
    <bean id="XYZ" class="FactoryBean1" scope="prototype">
        <property name="steps">
            <bean class="FactoryBean2">
                <property name="itemReader" ref="aName"/>
            </bean>
        </property>
    </bean>
    
    <bean id="aName" class="com.package.ClassName1" scope="prototype">
        <property name="objectContext">
            <bean class="com.package.ABC"/>
        </property>
    </bean>
    
    <!-- Case 2-->
    <bean id="XYZ2" class="FactoryBean1" scope="prototype">
        <property name="steps">
            <bean class="FactoryBean2">
                <property name="itemReader" ref="aName2"/>
            </bean>
        </property>
    </bean>
    
    <bean id="aName2" class="com.package.ClassName1" scope="prototype">
        <property name="objectContext">
            <bean class="com.package.QWE"/>
        </property>
    </bean>
    

    实际上,名为“xyz”(与“xyz2”比较)的bean的定义永远不会更改,但由于工厂性质,我必须为每个配置复制代码。 名为“a name”的bean的定义总是新的(即每个配置都有自己的objectcontext值)。

    我想简化配置,使用一个工厂bean(删除“xyz2”并去掉指向“aname”的链接):

    <bean id="XYZ" class="FactoryBean1" scope="prototype">
        <property name="steps">
            <bean class="FactoryBean2"/>
        </property>
    </bean>
    
    <bean id="aName" class="com.package.ClassName1" scope="prototype">
        <property name="objectContext">
            <bean class="com.package.ABC"/>
        </property>
    </bean>
    
    
    <bean id="aName2" class="com.package.ClassName1" scope="prototype">
        <property name="objectContext">
            <bean class="com.package.QWE"/>
        </property>
    </bean>
    

    不幸的是,事情并不像我想象的那么简单。我想在运行时将工厂(即示例中的xyz bean)与必要的对象(即“aname”、“aname2”)进行粘合。 这种方法不起作用,因为当我向Spring请求FactoryBean对象时,它会返回到我的FactoryBean.getObject(),因为缺少itemReader值,所以当时无法声明它。

    我希望SpringSource预见到我的情况,我可以在运行时调用一些home“hook”factrybean.getobject()来提供所有必要的属性。

    另一个让我有点不安的复杂性是工厂链(Factory1从Factory2获取一个对象,我必须在运行时“钩住”)。

    任何想法都会受到赞赏。

    2 回复  |  直到 12 年前
        1
  •  20
  •   reevesy onejigtwojig    12 年前

    这是 & (和号),而不是at符号,请参见Spring框架文档: Customizing instantiation logic using FactoryBeans

    <property name="factoryBean" ref="&amp;theFactoryBean" />
    
        2
  •  2
  •   oxbow_lakes    15 年前

    您可以使用 & Spring配置中的语法:

    <property name="factoryBean" ref="&theFactoryBean" />
    

    与之相反:

    <property name="createdBean" ref="theFactoryBean" />