#spring #spring-boot
#весна #пружинный ботинок
Вопрос:
У меня есть приложение spring boot с некоторыми репозиториями (т. Е. памятью, базой данных), которые реализуют общий интерфейс (IRepository) и фабрику для доступа к ним, как показано ниже.
public class SomeRepositoryFactory { public IRepository getRepository(String repoType) { if (repoType == "Database") { return new DatabaseRepository(); } else if (repoType == "InMemory") { return new InMemoryRepository(); } return null; } }
Существует также класс обслуживания, который имеет репозиторий в качестве зависимости
public class SomeService { private IRepository repository; public SomeService (IRepository repository) { this.repository = repository; } }
Мне удалось подключить их вручную со следующей конфигурацией
@Configuration public class MyConfig { @Bean public SomeRepositoryFactory someRepositoryFactory() { return new SomeRepositoryFactory(); } @Bean public IRepository someRepository() { return someRepositoryFactory().getRepository("InMemory"); } @Bean public SomeService someService() { return new SomeService(someRepository()); } }
Тем не менее, я хотел бы попробовать использовать автозапуск для достижения этой цели. В частности, я не уверен, как внедрить класс обслуживания в репозиторий, который извлекается с завода. В идеале я хотел бы иметь такую аннотацию
@Component @inject with SomeRepositoryFactory.getRepository.("InMemory") public class SomeService { private IRepository repository; public SomeService (IRepository repository) { this.repository = repository; } }
Ответ №1:
Если у вас есть только один компонент с реализацией интерфейса, вы просто должны внедрить его, как и любой другой управляемый экземпляр. Вы можете использовать @Autowire
инъекцию конструктора, инъекцию сеттера и т. Д.
Это должно просто сработать:
@Component public class SomeService { private IRepository repository; // Constructor injection here, should find the bean from someRepository configuration method public SomeService (IRepository repository) { this.repository = repository; } }
В случае, если у вас есть несколько реализаций для одного и того же интерфейса, вы можете аннотировать его инъекцией с @Qualifier
:
@Component public class SomeService { private IRepository repository; public SomeService (@Qualifier("someRepository") IRepository repository) { this.repository = repository; } }