2016-03-28 6 views
6

Ich habe eine Klasse ähnlich den folgenden:Wie registriert man mehrere Beans mit einzelnen @ Bean-Annotated-Methode (oder ähnlich) im Frühjahr?

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

    ... 

} 

Das Problem ist, dass es zu viele @ Bean-kommentierten Methoden, die in ihrem Namen nur dadurch unterscheiden, Rückgabetypen und Argumente für den crateService Methodenaufruf. Ich mag diese Klasse ähnlich den folgenden machen:

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

} 

Ist es möglich, im Frühjahr?

+1

Natürlich ja. Aber Sie haben nur eine injizierbare Bean im Anwendungskontext: die Karte. –

+1

Können Sie bitte im Detail erläutern, was Sie erreichen möchten? Ich sehe nicht, wie viele @Bean-Annotated-Methoden mit unterschiedlichen Rückgabetypen und -namen ein Problem darstellen. Idealerweise gruppieren Sie diese @ Bean-Methoden in separaten @ Configuration-Klassen, sodass Sie nicht eine einzige Gott-Klasse haben, die die gesamte Konfiguration enthält. Sie können verschiedene Konfigurationsklassen importieren, um definierte @ Bean-Methoden wiederzuverwenden. – hovanessyan

+0

Ich habe auch genau die gleiche Anforderung. In meinem Fall lese ich zuerst die Konfigurationsdaten aus einer Datei und für jeden Eintrag in der Konfiguration muss ich eine Bean erstellen (alle vom gleichen Java-Typ mit unterschiedlichen Daten). Daher kann ich @Bean Annotation nicht verwenden, da es von einer Konfig – Harish

Antwort

2
@Configuration 
public class ApplicationConfiguration { 

    @Autowired 
    private ConfigurableBeanFactory beanFactory; 

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

Bitte versuchen Sie, Code als Antwort zu vermeiden und versuchen Sie zu erklären, was er tut und warum. Ihr Code ist möglicherweise nicht offensichtlich für Personen, die nicht über die entsprechende Codiererfahrung verfügen. – Frits

+0

'@ PostConstruct' benötigt eine no-arg-Methode. Dies ist nicht hilfreich, wenn Sie Bohnen und Eigenschaften injizieren müssen. – Stewart

+0

'@ PostConstruct' wird ausgeführt, nachdem die Beans und Eigenschaften in das Objekt' @Configuration' injiziert wurden. (und in seinem Beispiel verwendet er sogar eine injizierte Bohnenfabrik) – Ryan

Verwandte Themen