2009-06-03 12 views
10

Ben aşağıdaki XML yapılandırmasına sahip:Belirli bir türdeki tüm çekirdeklerin listesini içeren bir fasulye özelliği ayarlamak için Spring XML yapılandırmasını nasıl kullanabilirim?

<bean id="bean1" class="Simple"/> 
<bean id="bean2" class="Simple"/> 

<bean id="tasks" class="java.util.ArrayList"> 
    <constructor-arg> 
     <list> 
      <ref bean="bean1" /> 
      <ref bean="bean2" />     
     </list> 
    </constructor-arg> 
</bean> 

<bean id="list" class="Comp"> 
    <property name="tasks" ref="tasks"/> 
</bean> 

"görevleri" Basit türdeki tüm fasulye içerir. Bununla ilgili sorun, listeye yapılandırdığım basit bir fasulye eklemeyi unutmam.

programlama

Map map = context.getBeansOfType(Simple.class); 

kullanarak ve alınan fasulye liste fasulye ayar yapabiliriz.

Sadece XML yapılandırması kullanarak bunu yapmanın bir yolu var mı? Bu isterim

cevap

8

Sizin bağlam dosyası:

<bean id="bean1" class="Simple"/> 
<bean id="bean2" class="Simple"/> 

<bean id="list" class="Comp" autowire="byType"/> 

Not autowire="byType" eklenmesi ve the autowiring documentation.

+0

Bu, listenin kendisini Comp'in görevleri özelliğine koymaz mıydı? Bu, listenin kendisini basit Fasulyenin tüm çekirdekleriyle doldurmaya nasıl yardımcı olur? – rudolfson

+1

@rudolfson: Liste artık mevcut olmamalı ve @Autowired için javadoc'un kuralları iyi bir açıklaması var: http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans /factory/annotation/Autowired.html –

+0

Aydınlattığınız için teşekkürler. Autowire belgelerini sonuna kadar okumadım ve bu yeteneğin farkında değildim. Cevabınız için +1! – rudolfson

3

Böyle bir liste oluşturmak için kendi FactoryBean'unuzu yazmanızı öneririm. Bu yeniden kullanılabilir ve daha sonra yalnızca XML kullanılarak yapılandırılabilir.

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.beans.factory.FactoryBean; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 
import org.springframework.util.Assert; 

public class CollectingListFactoryBean implements FactoryBean, ApplicationContextAware { 
    private ApplicationContext appCtx; 
    private Class type; 

    public Object getObject() { 
     Assert.notNull(type, "type must be initialized"); 
     List result = new ArrayList(); 
     result.addAll(appCtx.getBeansOfType(type).values()); 
     return result; 
    } 

    public Class getObjectType() { 
     return List.class; 
    } 

    public boolean isSingleton() { 
     return false; 
    } 

    public void setApplicationContext(ApplicationContext applicationContext) { 
     this.appCtx = applicationContext; 
    } 

    public void setType(Class type) { 
     this.type = type; 
    } 
} 

Sonra XML yapılandırma

<bean id="bean1" class="Simple"/> 
<bean id="bean2" class="Simple"/> 

<bean id="tasks" class="CollectingListFactoryBean"> 
    <property name="type" value="Simple" /> 
</bean> 

<bean id="list" class="Comp"> 
    <property name="tasks" ref="tasks"/> 
</bean> 

NOT olacak gibi FactoryBean görünecektir: Ben yukarıdaki örneği test etmek için zaman yoktu. Sadece şablon olarak kullandığım kodu kullandım. ;) Özellikle type özelliği için Class bağımsız değişkeni olarak Simple aktarımının bu şekilde çalışıp çalışmadığından emin değilim. Sadece bir dene. En kötü durumda, özellik olarak String'u kullanmanız ve sınıfınızı almak için Class.forName(type)'u kullanmanız gerekir. Ama benim tahminim, Spring'in sizin için bu dönüşümü yaptığı.

EDIT Bu çözüm işe yaramasa da, Robert Munteanu'nun yanıtını öneririm.

İlgili konular