2012-11-08 17 views
14

bir enums haritası oluşturmak nasıl, enam haritalar için fasulye referansları saf java config (şu anda XML & çalışır) içinde olmak için dönüştürmek için çalışıyorum ama Belgesellerde hiçbir şey bulamıyor;Spring Java Yapılandırma - Java tabanlı yapılandırma ile fasulye referanslarına

Şu anda benim XML'im böyle;

<util:map id="colourHanders" key-type="com.example.ColourEnum" 
      value-type="com.example.ColourHandler"> 
    <entry key="white" value-ref="whiteColourHandler"/> 
    <entry key="blue" value-ref="blueColourHandler"/> 
    <entry key="red" value-ref="redColourHandler"/> 
</util:map> 

Bunun kolay olduğunu ama yine (bu yüzden herhangi bir XML yapılandırma dosyaları yok) Saf Java bu temsil etmek nasıl konuyla ilgili bir şey bulamıyorum eminim ..

Not; ColourHandler fasulye, @Component ek açıklama kullanılarak oluşturulur örn ..

@Component 
public class RedColourHandler implements ColourHander{ 
..... 
} 

ve colourHandlers haritası böylece başvurulmaktadır;

@Resource(name="colourHandlers") 
    private Map<ColourHandlerEnum, ColourHandler> colourHandlers; 

sayesinde

Ian. Bu aslında güzel

@Configuration 
public class MyConfiguration { 
    @Autowired private WhiteColourHandler whiteColourHandler; 

    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteColourHandler); 
     return map; 
    } 
} 
+0

Ne denedin? Hangi hata üretildi? –

+0

Üzgünüm - bu XML'de çok çalışıyorum ve şu anda hala XML temsilcisini kullanıyorum ve içe aktarıyorum ama bunu saf Java'ya dönüştürmek istiyorum ve XML yapılandırma dosyaları yok – Ian

cevap

14

Muhtemelen böyle bir şey istiyorum basit ama nasıl bilmeniz gerekir:

fasulyeleri bir konfigürasyona enjekte edebilirsiniz. yerine Autowiring bileşenlerinin, dışında kabul cevaba benzer

+0

Bu işe yaramaz ama iki dezavantajı var: Harita bir prototip alıyor ve WhiteHandler’in otomatik kablo bağlantısı olmayacak. –

+2

Hayır, “whiteHandler()”, Haritaya bağlanacak olan bir tekil sunacaktır.Spring, '@ Configuration 'sınıflarını yeniden yazmak için cglib kullanır, bu nedenle kaynak dosyanızdaki kod çalıştırılan kod değildir. – hertzsprung

+0

Sınıftaki çağrılar için bu doğru değil. cglib yalnızca aramaları dışarıdan korur, Bahar kodların akışını yöntemlerin içinde analiz etmez. –

1

: Eğer @Component s olarak işleyicileri tutmanız gerekiyorsa, o zaman yapılandırma sınıfa bunları autowire olabilir

@Configuration 
public class MyConfiguration { 
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers() { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteHandler()); 
     // etc 
     return map; 
    } 

    @Bean public ColourHandler whiteHandler() { 
     return new WhiteHandler(); 
    } 
} 

:

1

, her zamanki gibi yapılandırma sınıfında fasulye beyan ve Harita fasulye yöntemine argüman olarak geçirebilirsiniz:

@Configuration 
public class MyConfiguration { 
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers(ColourHandler whiteHandler) { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteHandler); 
     return map; 
    } 

    @Bean public ColourHandler whiteHandler() { 
     return new WhiteHandler(); 
    } 
} 

Ayrıca unutmayın Alan adı, fasulye tanımıyla aynı adlandırma kuralını izliyorsa, @Resource olarak haritanın enjeksiyonu, ek açıklamanın "isim" parametresine gerek duymaz. Sadece olur, zaten her ColorHandler için benzersiz sınıf/@ Bileşen olduğundan

@Resource(name="colourHandlers") 
private Map<ColourHandlerEnum, ColourHandler> handlers; 
0

: Bu yani

adı parametre olmadan çalışacak:

@Resource 
private Map<ColourHandlerEnum, ColourHandler> colourHandlers; 

ama bu gerektirecek Spring'in ne kullanacağını belirlemesine izin ver (@Owire bağlantısı gerekmiyor veya herhangi bir ek oluşturma yöntemi gerekmez):

@Configuration 
public class MyConfiguration { 
    @Bean public Map<ColourEnum, ColourHandler> colourHandlers(
      WhiteColourHandler whiteHandler, 
      BlueColourHandler blueHandler, 
      RedColourHandler redHandler) { 
     Map<ColourEnum, ColourHandler> map = new EnumMap<>(); 
     map.put(WHITE, whiteHandler); 
     map.put(BLUE, blueHandler); 
     map.put(RED, redHandler); 
     return map; 
    } 
} 
İlgili konular