2010-08-25 12 views
5

Bazı kodları paylaşan ve ayrıntılarda farklılık gösteren bir Spring 2.5 yönetilen projesinde üç uygulamam var.Bahar içeriğine harici bir özellik enjekte

Her uygulamanın, uygulama içeriği oluşturulmadan önce kullanılan bir özelliği vardır (java.lang.String).

Uygulama bağlamı oluşturmak biraz zaman alır ve ilk olarak gerçekleşemez. Bu nedenle, her bir uygulamada tanımlanmıştır. Bu özellik, orada da ihtiyaç duyulduğundan bağlam tanımında çoğaltılır. Bu kopyadan kurtulabilir miyim?

Bu özelliği uygulama içeriğime enjekte etmek mümkün müdür?

cevap

5

PropertyPlaceholderConfigurer'a bakın.

Yay belgeleri bu konuda konuşuyor here. her yerde uygulama bağlamında, constructor-arg, bahar 3.0 ile property vb

+0

Yine de, "özel String appName = ...", benim uygulama dizimde bazı fasulyeler için bir özellik olarak kullanamıyorum, değil mi? – DerMike

+0

Hayır, Java sözdizimi olduğu gibi, uygulama içeriği de bir XML dosyasıdır. Bir özellik dosyanız varsa ve appName için örneğin, appName = Uygulamam gibi bir özelliği içeriyorsa, PropertyPlaceholderConfigurer kurulduktan sonra '$ myPrefix {appName}' öğesine başvurabilirsiniz ve (bu durumda) Uygulamam’a –

+0

En iyi ihtimalle ctx.addBean (String.class, appName) 'gibi bir şey bulmayı umuyordum. – DerMike

3

Eğer @Value("${property}") var içinde İsterdim

<bean id="myPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:my-property-file.properties"/> 
    <property name="placeholderPrefix" value="$myPrefix{"/> 
</bean> 

<bean id="myClassWhichUsesTheProperties" class="com.class.Name"> 
    <property name="propertyName" value="$myPrefix{my.property.from.the.file}"/> 
</bean> 

Daha sonra bu dize başvurusunu var. Tanımlanmış PropertyPlaceholderConfigurer çekirdeklerini kullanır.

ilkbahar 2.5 Sahada tekrar PropertyPlaceholderConfigurer kullanmak ve daha sonra daha sonra autowire olabilir tip java.lang.String bir fasulye tanımlayabilirsiniz: Harici özellikler karşısında istemiyorsanız

<bean id="yourProperty" class="java.lang.String"> 
    <constructor-arg value="${property}" /> 
</bean> 

@Autowired 
@Qualifier("yourProperty") 
private String property; 
1

, bazı tanımlayabiliriz ortak fasulye

<bean id="parent" class="my.class.Name"/> 

sonra bir şekilde bunu başlatmak ve ortak bahar xml dosyasına koymak, common.xml Diyelim ki.

<import resource="common.xml"/> 

ve sonra ilgilendiğiniz fasulye içine ebeveyn özelliklerini enjekte edebilir:

Çocuğunuz bağlam xml dosyasında - Bundan sonra, her veya uygulamalarınız için bir ebeveyn olarak bu bağlamda yapabilirsiniz
<bean ... 
<property name="myProperty" value="#{parent.commonProperty}"/> 
... 
</bean>