Question

Question courte : Si j'ai une classe qui implémente l'interface FactoryBean, comment puis-je obtenir de l'objet FactoryBean lui-même au lieu de FactoryBean.getObject() ?

Longue question : Je dois utiliser une bibliothèque tierce basée sur Spring qui n'utilise pratiquement pas l'interface FactoryBean.En ce moment, je dois toujours configurer 2 beans :

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

En fait, la définition d'un bean portant le nom "XYZ" (à comparer avec "XYZ2") ne sera jamais modifiée, mais en raison de la nature de l'usine, je dois copier le code pour chaque configuration.La définition d'un bean portant le nom "aName" sera toujours nouvelle (c'est-à-direchaque configuration aura sa propre valeur objectContext).

Je voudrais simplifier la configuration avec un seul bean d'usine (supprimer "XYZ2" et débarrasser du lien vers "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>

Malheureusement, ce n'est pas aussi simple que je le pensais.Je suppose qu'il faut coller l'usine (c'est-à-direBean XYZ de l'exemple) avec les objets nécessaires (c'est-à-dire"aName", "aName2") au moment de l'exécution.L'approche ne fonctionne pas car lorsque je demande à Spring un objet FactoryBean, il me renvoie FactoryBean.getObject(), ce qui est impossible à instancier à ce moment-là en raison de la valeur itemReader manquante.

J'espère que SpringSource prévoira mon cas. Je pourrai "accrocher" l'appel FactoryBean.getObject() pour fournir toutes les propriétés nécessaires au moment de l'exécution.

Une autre complexité qui me dérange un peu ce sont les chaînes de Factories (Factory1 récupère un objet de Factory2 que je dois "accrocher" au runtime).

Toutes les idées sont les bienvenues.

Était-ce utile?

La solution

C'est le & (esperluette), pas le symbole At, voir la documentation Spring Framework : Personnalisation de la logique d'instanciation à l'aide de FactoryBeans

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

Autres conseils

Vous pouvez obtenir le grain d'usine lui-même en utilisant le & syntaxe dans la configuration Spring :

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

par opposition à :

<property name="createdBean" ref="theFactoryBean" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top