2009-10-31 21 views
12

Kısa soru: Fabrikadan çıkış yapanlar için bir sınıf varsa, FactoryBean nesnesinden FactoryBean.getObject() yerine nasıl alabilirim?İlkbahar: FactoryBean.getObject() yerine FactoryBean nesnesini alma

Uzun bir soru: 3-rd party Spring tabanlı kütüphaneyi kullanmak zorundayım. Şu anda hep 2 fasulye yapılandırmanız gerekir:

<!-- 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> 
adı "XYZ" ("XYZ2" ile karşılaştırın) ile bir fasulye

Actyually Definition değişecektir asla , fakat fabrika doğanın ben her biri için kodu kopyalayıp gerekir yapılandırması. "aName" ismine sahip bir fasulyenin tanımı her zaman yeni olacaktır (yani her bir konfigürasyon kendi objectContext değerine sahip olacaktır).

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

Ne yazık ki, beklediğim kadar basit değil: Ben yapılandırmayı basitleştirmek istiyoruz

(için "AName" "XYZ2" kaldırmak ve bağlantı kurtulmak) tek fabrika fasulye var. Çalışma zamanında gerekli nesneleri (yani "aName", "aName2") ile fabrika (örneğin XYZ fasulye) tutkal varsayalım. Yaklaşma çalışmıyor çünkü Spring for FactoryBean nesnesini sorduğumda, o zaman itemReader değerinin eksik olması nedeniyle instanci için imkansız olan FactoryBean.getObject() ürününe dönüyor.

Umarız SpringSource benim durumumu öngörürken, çalışma zamanında tüm gerekli özellikleri sağlamak için FactoryBean.getObject() çağrısı "kanca" yapabilirim.

Beni biraz rahatsız eden başka bir karmaşıklık, Fabrikaların zincirleridir (Factory1, Factory2'den, çalışma zamanında "hook" yapmam gereken bir nesne alır).

Herhangi bir fikir takdir edilecektir.

cevap

20

O & (ve işareti) var, değil At-sembol Spring Framework belgelerine bakın: Customizing instantiation logic using FactoryBeans

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

Yani öyle. Hata! –

+1

Gerçekten kontrol ettin mi? Bu şekilde denedim ve istisna ile başarısız olur: Nedeniyle: org.xml.sax.SAXParseException: "TheFactoryBean" öğesine yapılan başvuru, ';' ile bitmelidir. sınırlayıcı. – wax

+0

@wax: teşekkürler, tabiki haklısınız, XML düzgün bir şekilde kaçmalı. Bunu düzeltdim – mhaller

2

Sen bahar config & sözdizimi kullanarak fabrika fasulye kendisi alabilirsiniz: aksine

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

:

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

Bu çözüm cked? Senin için çalışıyor mu? – wax

+0

Açıkladığınız gibi çalışmıyor. Doğru cevap aşağıda. – wax