2016-03-28 9 views
6

Ho una classe simile al seguente:Come registrare più bean usando il metodo single @ Bean-annotated (o simile) in primavera?

@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); 
    } 

    ... 

} 

Il problema è che ci sono troppi @ metodi di Bean-annotati che differiscono solo nei loro nomi, restituiscono i tipi e gli argomenti per la chiamata crateService metodo. Vorrei fare questa classe simile al seguente:

@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; 
    } 

} 

E 'possibile in primavera?

+1

Naturalmente sì. Ma avrai un solo fagiolo iniettabile nel contesto dell'applicazione: la mappa. –

+1

Puoi spiegare in dettaglio cosa stai cercando di ottenere? Non vedo come avere molti metodi annotati @ Bean con diversi tipi di ritorno e nomi è un problema. Idealmente raggrupperai i metodi @ Bean in classi @ Configuration separate, quindi non avrai una sola classe God che mantenga l'intera configurazione. Puoi @ Importare diverse classi di configurazione per riutilizzare i metodi definiti @ Bean. – hovanessyan

+0

Ho anche lo stesso requisito. Nel mio caso, sto prima leggendo i dati di configurazione da un file e per ogni voce nel config, ho bisogno di creare un bean (tutto dello stesso tipo java con dati diversi). Quindi non posso usare l'annotazione @Bean, dato che deve essere letta da una configurazione – Harish

risposta

2
@Configuration 
public class ApplicationConfiguration { 

    @Autowired 
    private ConfigurableBeanFactory beanFactory; 

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

Si prega di cercare di evitare di scaricare semplicemente il codice come risposta e cercare di spiegare cosa fa e perché. Il tuo codice potrebbe non essere ovvio per le persone che non hanno esperienza di codifica rilevante. – Frits

+0

'@ PostConstruct' ha bisogno di un metodo no-arg. Questo non è utile se è necessario iniettare fagioli e proprietà – Stewart

+0

'@ PostConstruct' viene eseguito dopo che i bean e le proprietà sono stati iniettati nell'oggetto' @ Configuration'. (e nel suo esempio ha persino usato una fabbrica di fagioli iniettata) – Ryan

Problemi correlati