Breve domanda: Se ho una classe che impela l'interfaccia FactoryBean, come posso ottenere dall'oggetto FactoryBean stesso invece di FactoryBean.getObject()?Spring: ottenere oggetto FactoryBean invece di FactoryBean.getObject()
Lunga domanda: Devo utilizzare la libreria di terze parti basata su Spring che difficilmente utilizza l'interfaccia FactoryBean. In questo momento ho sempre necessario configurare 2 fagioli:
<!-- 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 defintion di un fagiolo con il nome "XYZ" (confrontare con "XYZ2") non sarà cambiato, ma a causa della fabbrica di natura devo copiare il codice per ogni configurazione. La definizione di un bean con nome "aName" sarà sempre nuova (ad esempio, ogni configurazione avrà il proprio valore objectContext).
vorrei semplificare la configurazione hanno un unico chicco di fabbrica (togliere "XYZ2" e liberarsi di link verso "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>
Purtroppo, non è così semplice come mi aspetto. Suppongo di incollare la factory (cioè il bean XYZ dell'esempio) con gli oggetti necessari (ad esempio "aName", "aName2") in fase di esecuzione. L'approccio non funziona perché quando chiedo a Spring l'oggetto FactoryBean restituisce FactoryBean.getObject() che non è possibile instanciare in quel momento a causa del valore mancante di itemReader.
Spero che SpringSource preveda il mio caso Posso chiamare "hook" FactoryBean.getObject() per "home" per fornire tutte le proprietà necessarie in fase di runtime.
Un'altra complessità che mi disturba un po 'sono le catene di fabbriche (Factory1 ottiene un oggetto da Factory2 che devo "agganciare" in fase di esecuzione).
Tutte le idee saranno apprezzate.
Così è. Oops! –
Lo hai davvero controllato? Ho provato in questo modo e fallisce con un'eccezione come: Causata da: org.xml.sax.SAXParseException: il riferimento all'entità "theFactoryBean" deve terminare con ';' delimitatore. – wax
@wax: grazie, naturalmente, hai ragione, l'XML deve essere scappato correttamente. L'ho corretto – mhaller