У меня есть класс, подобный следующему:Как зарегистрировать несколько бобах, используя один метод @ 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;
}
}
возможно ли это весной?
Конечно, да. Но в контексте приложения у вас будет только один инъекционный компонент: карта. –
Не могли бы вы подробно объяснить, чего вы пытаетесь достичь? Я не вижу, как проблема с множеством @ Bean аннотированных методов с разными типами возвращаемых имен и имен. В идеале вы будете группировать эти @ Bean-методы в отдельных классах @ Configuration, так что у вас не будет одного класса God, содержащего всю конфигурацию. Вы можете @ Импортировать разные классы конфигурации для повторного использования определенных методов @ Bean. – hovanessyan
У меня также есть то же требование. В моем случае я сначала читаю данные конфигурации из файла и для каждой записи в конфиге, мне нужно создать bean-компонент (все тот же тип java с разными данными). Поэтому я не могу использовать аннотацию @Bean, так как ее нужно читать из конфигурации – Harish