Внедрение зависимостей одноэлементного класса, которое расширяется из интерфейса

#java #spring

#java #spring

Вопрос:

У меня есть одноэлементный класс ReadingStratgeyImp , который расширяется из интерфейса ReadingStrategy . In readingStrategyImp-getInstance() метод вернет экземпляр ReadingStrategyImp .

Вот мой запрос: я хочу внедрить зависимость ReadingStrategyImp в несколько других классов проекта. Я добиваюсь этого с помощью приведенного ниже кода

     ReadingStrategy readingStrategy;

    @Autowired
    public void setReadingStrategy(ReadingStrategyImp readingStrategy) {
        this.readingStrategy = ReadingStrategyImp.getInstance();
    }
  

Я хочу знать, как можно внедрить зависимость.

Ответ №1:

Вы просто делаете это :

 @Component
public class Sample {

  // spring will automatically find the implementation class and inject it. 
  // so, the ReadingStrategyImp class will automatically injected. 
  @Autowired 
  @Qualifier("readingStrategyImp")
  private ReadingStrategy readingStrategy;

}
  

Вот и все.

Комментарии:

1. Если есть два класса, которые реализуют ReadingStrategy, мне нужны отдельные экземпляры реализованных классов. Как это может помочь в достижении того же?

2. @RiaSachdeva Вы должны использовать @Qualifier для этого. Скажите мне имя класса, которое вы должны ввести. Я отредактирую свой ответ.

3. Я попробовал один, но он не работает, если класс является одноэлементным.

4. Я могу внедрить зависимость, но я хочу получить доступ к тому же экземпляру, что и класс, который является одноэлементным. Здесь проблема заключается в том, что каждый раз, когда я автоматически подключаю его, создается новый экземпляр этого компонента. Отредактирует код со структурой программы и результатами.

5. @RiaSachdeva Нет !! При автоматическом подключении новый экземпляр не создается. В контейнере IOC компоненты создаются при запуске, и эти компоненты являются одноэлементными по своей природе. Итак, вы вводите только одноэлементный компонент.

Ответ №2:

Если я правильно понимаю ваш вопрос, вы должны сначала создать компонент для ReadingStrategy с помощью ReadingStrategyImp:

 @Bean
public ReadingStrategy readingStrategy() {
   return ReadingStrategyImp.getInstance();
}
  

Тогда вы могли бы просто автоматически подключить ReadingStrategy там, где вам это нужно.

 @Autowired ReadingStrategy readingStrategy;
  

Всегда лучше зависеть от интерфейсов, а не от конкретных классов.