Frage

Kurze Frage: Wenn ich eine Klasse habe, die eine factoryBean -Schnittstelle für die Fabrikbeamte anstelle von factoryBean.getObject () von FactoryBean selbst bekommen kann?

Lange Frage: Ich muss eine 3-RD-Party-Frühlingsbasis verwenden, die kaum die FactoryBean-Schnittstelle verwendet. Im Moment muss ich immer 2 Bohnen konfigurieren:

<!-- 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>

Akzente Definition einer Bean mit Name "xyz" (verglichen mit "xyz2") wird niemals geändert, aber aufgrund der fabrischen Natur muss ich den Code für jede Konfiguration kopieren. Die Definition einer Bean mit dem Namen "Aname" ist immer neu (dh jede Konfiguration hat einen eigenen ObjectContext -Wert).

Ich möchte die Konfiguration vereinfachen, die eine einzelne Werksbohne hat (entfernen Sie "xyz2" und entfernen Sie den Link zu "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>

Leider ist es nicht so einfach, wie ich es erwarte. Ich nehme an, die Fabrik (dh XYZ -Bohne aus dem Beispiel) mit den notwendigen Objekten (dh "Aname", "Aname2") zur Laufzeit zu kleben. Der Ansatz funktioniert nicht, denn wenn ich den Frühling nach FactoryBean -Objekt frage, kehrt er mir fabrorybean.getObject () zurück, was zu diesem Zeitpunkt aufgrund des fehlenden ItemReader -Wertes nicht zu instanziieren ist.

Ich hoffe, dass SpringSource meinen Fall voraussse, kann ich irgendwie "Hook" FactoryBean.getObject () aufrufen, um alle notwendigen Eigenschaften zur Laufzeit bereitzustellen.

Eine andere Komplexität, die mich ein wenig stört, sind die Ketten von Fabriken (Factory1 erhalten ein Objekt von Factory2, das ich zur Laufzeit "haken" muss).

Alle Ideen werden geschätzt.

War es hilfreich?

Lösung

Es ist das & (Ampersand), nicht das At-Symbol, siehe Spring Framework-Dokumentation: Anpassung der Instanziierungslogik mithilfe von Werksbewohnern

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

Andere Tipps

Sie können die Werksbohne selbst mit dem erhalten & Syntax in der Federkonfiguration:

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

im Gegensatz zu:

<property name="createdBean" ref="theFactoryBean" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top