2016-03-28 2 views
6

У меня есть класс, подобный следующему:Как зарегистрировать несколько бобах, используя один метод @ Bean-annotated (или аналогичный) весной?

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

    ... 

} 

Проблема заключается в том, что существует слишком много @ Бин-аннотированных методов, которые отличаются только своими именами, типы и аргументы возвращают для вызова crateService метода. Я хотел бы сделать этот класс, подобный следующему:

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

} 

возможно ли это весной?

+1

Конечно, да. Но в контексте приложения у вас будет только один инъекционный компонент: карта. –

+1

Не могли бы вы подробно объяснить, чего вы пытаетесь достичь? Я не вижу, как проблема с множеством @ Bean аннотированных методов с разными типами возвращаемых имен и имен. В идеале вы будете группировать эти @ Bean-методы в отдельных классах @ Configuration, так что у вас не будет одного класса God, содержащего всю конфигурацию. Вы можете @ Импортировать разные классы конфигурации для повторного использования определенных методов @ Bean. – hovanessyan

+0

У меня также есть то же требование. В моем случае я сначала читаю данные конфигурации из файла и для каждой записи в конфиге, мне нужно создать bean-компонент (все тот же тип java с разными данными). Поэтому я не могу использовать аннотацию @Bean, так как ее нужно читать из конфигурации – Harish

ответ

2
@Configuration 
public class ApplicationConfiguration { 

    @Autowired 
    private ConfigurableBeanFactory beanFactory; 

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

Пожалуйста, старайтесь избегать просто демпинга кода в качестве ответа и попытаться объяснить, что он делает и почему. Ваш код может быть не очевидным для людей, у которых нет соответствующего опыта в кодировании. – Frits

+0

'@ PostConstruct' нуждается в методе no-arg. Это не полезно, если вам нужно вводить beans & properties – Stewart

+0

'@ PostConstruct' запускается после того, как компоненты и свойства были введены в объект' @ Configuration'. (и в его примере он даже использует завод по производству инжекционных бобов) – Ryan

Смежные вопросы