2016-03-28 13 views
6

aşağıdaki benzer bir sınıf var:İlkbaharda tek @ Bean-açıklamalı yöntem (veya benzer) kullanarak birden fazla fasulye nasıl kaydedilir?

@Configuration 
public class ApplicationConfiguration { 

    private <T> T createService(Class<T> serviceInterface) { 
     // implementation omitted 
    } 

    @Bean 
    public FooService fooService() { 
     return createService(FooService.class); 
    } 

    @Bean 
    public BarService barService() { 
     return createService(BarService.class); 
    } 

    ... 

} 

sorun, sadece isimleri farklı crateService yöntem çağrısı türleri ve argümanlar dönmek Fasulye-açıklamalı yöntemlere @ çok fazla var olmasıdır.

@Configuration 
public class ApplicationConfiguration { 

    private static final Class<?>[] SERVICE_INTERFACES = { 
      FooSerivce.class, BarService.class, ...}; 


    private <T> T createService(Class<T> serviceInterface) { 
     // implementation omitted 
    } 

    @Beans // whatever 
    public Map<String, Object> serviceBeans() { 
     Map<String, Object> result = ... 
     for (Class<?> serviceInterface : SERVICE_INTERFACES) { 
      result.put(/* calculated bean name */, 
        createService(serviceInterface)); 
     } 
     return result; 
    } 

} 

O kaynakta mümkün mü: şuna benzer bu sınıfı yapmak istersiniz?

+1

Tabii ki evet. Ancak uygulama kapsamında sadece bir tane enjekte edilebilir fasülyeye sahip olacaksınız: harita. –

+1

Neyi başarmaya çalıştığınızı ayrıntılı olarak açıklayabilir misiniz? Farklı dönüş türlerine ve isimlere sahip birçok Bean ek açıklamalı yöntemin nasıl bir sorun olduğunu anlamıyorum. İdeal olarak, aşağıdaki @ Bean yöntemlerini ayrı @ Yapılandırma sınıflarında gruplayacaksınız, böylece tüm yapılandırmayı tutan tek bir Tanrı sınıfına sahip olmayacaksınız. @ Tanımlanmış @ Bean yöntemlerini yeniden kullanmak için farklı yapılandırma sınıflarını içe aktarabilirsiniz. – hovanessyan

+0

Ayrıca aynı gereksinim var. Benim durumumda, önce bir dosyadan yapılandırma verilerini okuyorum ve her giriş için yapılandırmada, bir fasulye yaratmam gerekiyor (hepsi farklı veriyle aynı java tipi). Bu nedenle, @Bean ek açıklamasını kullanamıyorum, çünkü bir konfigürasyondan okunması gerektiği için – Harish

cevap

2
@Configuration 
public class ApplicationConfiguration { 

    @Autowired 
    private ConfigurableBeanFactory beanFactory; 

    @PostConstruct 
    public void registerServices() { 
     beanFactory.registerSingleton("service...", new NNNService()); 
     ... 
    } 
} 
+2

Lütfen sadece bir kodu cevap olarak dökmekten kaçının ve ne yaptığını ve nedenini açıklamaya çalışın. İlgili kodlama deneyimine sahip olmayan kişiler için kodunuz açık olmayabilir. – Frits

+0

'PostConstruct' argüman gerektirmez. Fasulye ve özellikleri – Stewart

+0

'@ PostConstruct 'öğesi, fasulye ve özellikler' @ Configuration' nesnesine enjekte edildikten sonra çalıştırmanız gerekiyorsa, bu yardımcı olmaz. (ve örneğinde enjekte edilmiş bir fasulye fabrikası bile kullanıyor) – Ryan

İlgili konular