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.
{$ classIdToBeUsed} veya $ {classIdToBeUsed} olması gerekiyor mu? –
$ {classIdToBeUsed} :) Yazım hatası, teşekkür ederim! Açıkçası, KISS :) – Olivier