Ввод вывода метода компонента в конструктор компонента

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