2009-04-28 14 views
6

Kerevitin özelliklerini çalışma zamanında java yayını kullanarak nasıl dinamik olarak değiştirebilirim? Ben "class1" veya "class2" özellik "sınıf" olarak kullanmalısınız bir fasulye mainView var. Bu karar, "withSmartcard" özelliğinin "Y" veya "N" olduğu bir özellik dosyasının tabanında yapılmalıdır.bahar fasulyelerini dinamik olarak değiştirin

ApplicationContext:

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class" ref="class1" /> 
</bean> 



<bean id="class1" 
    class="class1"> 
    <constructor-arg ref="mainView" /> 
</bean> 

<bean id="class2" 
    class="class2"> 
    <constructor-arg ref="mainView" /> 
</bean> 

PropertyFile:

withSmartcard = Y

cevap

1

kullanın sınıf fabrikası. Örneğin mülkünüze göre geri gönderilebilen .

10

sizin özellikleri dosya yönetmek için bir PropertyPlaceHolder kullanın ..

<bean id="myPropertyPlaceHolder" 
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <description>The service properties file</description> 
    <property name="location" value="classpath:/some.where.MyApp.properties" /> 
    </bean> 

ve aşağıdaki gibi sizin ref özelliğini değiştirin: senin özelliklerinde

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class" ref="${withSmartCardClassImplementation}" /> 
</bean> 

some.where.MyApp.properties dosyası, bir ekleme anahtarında, değer için class1 veya class2 (siz seçersiniz) olacak olan SmartCardClassImplementation.

withSmartCardClassImplementation=class1 
+0

{$ classIdToBeUsed} veya $ {classIdToBeUsed} olması gerekiyor mu? –

+0

$ {classIdToBeUsed} :) Yazım hatası, teşekkür ederim! Açıkçası, KISS :) – Olivier

4

PropertyPlaceholderConfigurer. Kılavuzun bu bölümü bunu yerinde yapabileceğimden daha iyi gösteriyor.

Örneğinizde, mülkün değerini class1 veya class2 (yay kapsamındaki istenen fasulyenin adı) olarak değiştirmeniz gerekir.

Alternatif olarak, yapılandırma olabilir: içerikli yapılandırma dosyası ile

<bean id="mainView" 
    class="mainView"> 
    <property name="angebotsClient" ref="angebotsClient" /> 
    <property name="class"> 
     <bean class="${classToUse}"> 
      <constructor-arg ref="mainView"/> 
     </bean> 
    </property> 
</bean> 

: olmaz fasulye veya sınıf isimleri kullanma classToUse = fully.qualified.name.of.some.Class

kullanıcı tarafından düzenlenebilir bir yapılandırma dosyasında kabul edilebilir ve yapılandırma parametresi değerleri olarak "Y" ve "N" harflerini kullanmanız gerekir. Bu durumda, bunu sadece Java'da yapmanız gerekecek, Spring turing-complete olmak zorunda değildir.

if (this.withSmartCards) { 
    this.class_ = context.getBean("class1"); 
} else { 
    this.class_ = context.getBean("class2"); 
} 

Bir temizlikçi çözüm kendi sınıfında kullanıcı yapılandırması işlenmesini enkapsüle olacağını ApplicationContextAware olması gerekiyor sınıfların sayısını azaltmak için yukarıdaki yapacağını: Doğrudan uygulama bağlamı erişebilir

Mainview ve gerektiğinde diğer sınıflarınıza enjekte edin.

BeanFactoryPostProcessor'u kullanarak, sınıf özelliğinin bir tanımını programsal olarak kaydedebilirsiniz.FactoryBean'u kullanarak, bir fasulyeyi dinamik olarak oluşturabilirsiniz. Her ikisi de Spring'in bir şekilde gelişmiş kullanımıdır.

Bir kenara: mainView ve class1/class2 arasındaki döngüsel bağımlılık göz önüne alındığında, örnek yapılandırmanızın yasal olup olmadığından emin değilim.

1

Yukarıdaki @Olivier ile katılıyorum.

Bunu yapmanın birçok yolu vardır.

  1. Kullanım PropertyPlaceholderConfigurer ..
  2. Kullanım BeanPostProcessor ..
  3. Kullanım Bahar AOP, bir tavsiye yaratıp özelliklerini işlemek.

Yukarıdaki madde no: 1'i öneririm.

+0

Yup için classIdToBeUsed değiştiriyorum – Olivier

+0

yup, basit ve kolay yönetilebilirlik nedeniyle withSmartCardClassImplementation – Satya

İlgili konular