Question courte: Si j'ai une classe qui impelle l'interface FactoryBean, comment puis-je obtenir l'objet FactoryBean lui-même au lieu de FactoryBean.getObject()?Spring: Obtention de l'objet FactoryBean au lieu de FactoryBean.getObject()
Longue question: Je dois utiliser une bibliothèque Spring basée sur un tiers qui utilise à peine l'interface FactoryBean. En ce moment je toujours dois configurer 2 haricots:
<!-- 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>
Actyually défintion d'un haricot avec le nom « XYZ » (comparer avec « XYZ2 ») ne sera changé, mais en raison de la nature de l'usine, je dois copier le code pour chaque configuration. La définition d'un bean avec le nom "aName" sera toujours nouvelle (c'est-à-dire que chaque configuration aura sa propre valeur objectContext).
Je voudrais simplifier la configuration ont un haricot unique usine (enlever « XYZ2 » et débarrasser de 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 pense. Je suppose que pour coller l'usine (c'est-à-dire le haricot XYZ de l'exemple) avec les objets nécessaires (c'est-à-dire "aName", "aName2") à l'exécution. L'approche ne fonctionne pas parce que quand je demande l'objet Spring pour FactoryBean, il me revient FactoryBean.getObject() qui est impossible à instancier à cause de la valeur itemReader manquante.
J'espère que SpringSource prévoit mon cas, je peux somehome "hook" appel FactoryBean.getObject() pour fournir toutes les propriétés nécessaires à l'exécution.
Une autre complexité qui me dérange un peu c'est les chaînes d'usines (Factory1 obtient un objet de Factory2 que je dois "hooker" à l'exécution).
Toutes les idées seront appréciées.
C'est ainsi. Oops! –
L'avez-vous vraiment vérifié? J'ai essayé de cette façon et il échoue avec des exceptions comme: Causé par: org.xml.sax.SAXParseException: La référence à l'entité "theFactoryBean" doit se terminer par le ';' délimiteur. – wax
@wax: merci, bien sûr que vous avez raison, le XML doit être échappé correctement. Je l'ai corrigé – mhaller